"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

Amy B
fuente

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 .

Jigar Joshi
fuente
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 .

Rob Di Marco
fuente
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).

Sean Patrick Floyd
fuente
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
        }
    }
}
Michael Borgwardt
fuente
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
5

No es una palabra clave; es una etiqueta .

Te permite ir etiquetado breaky etiquetado continue.

codaddict
fuente
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.

Arrendajo
fuente
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 .

PaulJWilliams
fuente
2

Podrías escribir casi cualquier cosa, ya que es una etiqueta ... Tienes un ejemplo aquí

SoulWanderer
fuente
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.

Alberto Zaccagni
fuente
1

Es una etiqueta, y las etiquetas en Java se pueden usar con breakycontinue palabras clave para un control adicional sobre los bucles.

Aquí se explica de una manera bastante buena:

Pensando en Java, romper y continuar

vstoyanov
fuente
1

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

greuze
fuente
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.

RTA
fuente