"Loop:" en código Java. ¿Qué es esto y por qué se compila?


113

Este código me hizo mirar fijamente mi pantalla durante unos minutos:

loop:
for (;;) {
    // ...
}

( línea 137 aquí )

Nunca había visto esto antes, y no tenía idea de que Java tiene una palabra clave de "bucle" (NetBeans ni siquiera la colorea como una palabra clave), y se compila bien con JDK 6.

Cual es la explicacion

Respuestas:


205

No es un keywordes un label.

Uso:

    label1:
    for (; ; ) {
        label2:
        for (; ; ) {
            if (condition1) {
                // break outer loop
                break label1;
            }
            if (condition2) {
                // break inner loop
                break label2;
            }
            if (condition3) {
                // break inner loop
                break;
            }
        }
    }

Documentación .


19
Vale la pena mencionar que, dado que el OP podría no estar familiarizado con el concepto goto / label, generalmente se considera una mala práctica, excepto en situaciones muy particulares (por ejemplo, para atajar múltiples bucles anidados).
Haylem

10
@haylem es cierto, pero iría más allá: varios bucles anidados también suelen ser una mala práctica. Siempre que usaba etiquetas de bucle, eventualmente refactorizaba el código para no necesitarlas. Siempre hay una forma mejor que esa.
Sean Patrick Floyd

73

Como han dicho otros carteles, es una etiqueta, no una palabra clave. El uso de etiquetas le permite hacer cosas como:

outer: for(;;) {
   inner: for(;;) {
     break outer;
   }
}

Esto permite romper el bucle exterior.

Enlace a la documentación .


31

La pregunta está respondida, pero como nota al margen:

He oído hablar de preguntas de entrevistas a la "¿Por qué es válido este código Java?" (eliminó el ejemplo más simple; aquí está el más malo, gracias Tim Büthe):

url: http://www.myserver.com/myfile.mp3
downLoad(url);

¿Sabrían todos qué es este código (aparte de horrible)?

Solución: dos etiquetas, urly http, un comentario www.myserver.com/myfile.mp3y una llamada de método con un parámetro que tiene el mismo nombre ( url) como la etiqueta. Sí, esto se compila (si define la llamada al método y la variable local en otro lugar).


Para su información, no necesita el bucle, a; en la siguiente línea es suficiente
Tim Büthe

Gracias por recordarme, creo que no hubo bucles en la pregunta. Editaré mi respuesta (nunca me hicieron esta pregunta, pero el entrevistador era un ex colega mío)
Sean Patrick Floyd

16

Esa no es una palabra clave, es una etiqueta. Está destinado a usarse con las palabras clave breaky continuedentro de los bucles anidados:

outer:
for(;;){
    inner:
    for(;;){
        if(){
            break inner; // ends inner loop
        } else {
            break outer; // ends outer loop
        }
    }
}

innerla etiqueta es inútil aquí, break;es suficiente
gertas

12
Si hay dos formas de romper el círculo, agradezco la inneretiqueta por claridad.
Steve Jackson

1
@gertas: Creo que solo está demostrando el punto. Pero según Steve Jackson, de todos modos podría ser una buena idea decirlo con fines de auto-documentación.
Jay


4

Esta es realmente una respuesta al comentario de seanizer sobre la respuesta de org.life.java, pero quería poner algo de código para no poder usar la función de comentarios.

Si bien es muy raro que encuentre un uso para "rotura de etiqueta", ocurre ocasionalmente. El caso más común es cuando estoy buscando algo que está en una estructura que requiere un bucle anidado para buscar, como:

search:
for (State state : stateList)
{
  for (City city : state.cityList)
  {
    if (city.zipcode.equals(wantZip))
    {
      doSomethingTo(city);
      break search;
    }
  }
}

Por lo general, en tales casos, empujo todo en una subrutina para que en un golpe pueda devolver el objeto encontrado, y si cae al final del bucle, puedo devolver un valor nulo para indicar que no se encontró, o tal vez lanzar una excepción. Pero esto es útil en ocasiones.

Francamente, creo que los inventores de Java incluyeron esta característica porque entre esto y el manejo de excepciones, eliminaron los dos últimos usos legítimos de GOTO.

Addendum muy tardío:

Una vez vi una gran línea de código mordaza. El programador escribió:

http://www.example.com/xyz.jsp
for (Foo foo1 : foolist)

En realidad, no dijo "example.com", sino el sitio web de nuestra empresa.

Da la impresión de que hay una URL en el código. Se compila con éxito, como si hiciera algo. ¿Pero, qué hace?

En realidad, no hace nada. "http:" es una etiqueta a la que nunca hace referencia. Luego, el "//" convierte el resto de la línea en un comentario.


4

Es una etiqueta de punto de ruptura, para permitirle salir de un bucle específico, en lugar de simplemente el más interno en el que se encuentra.

Se usa en la línea 148 .



2

Es una etiqueta, aunque mira el siguiente ejemplo:

int a = 0;
int b = 0
while (a<10){
    firstLoop:
    a++;
    while(true){
        b++
        if(b>10){
            break firstLoop;
        }
    }
 }

Cuando b>10el flujo de ejecución va al bucle exterior.



1

No es una palabra clave, sino una etiqueta . Si está dentro del forbucle, escribe break loop;y sale de ese bucle.


0

Es una etiqueta. Generalmente, una etiqueta que se usa en Java para transferir el flujo de control a la ubicación deseada, mientras que todas las palabras clave, como continuar y romper, tienen una opción específica de ubicación.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.