¿Cómo salgo de los bucles anidados en Java?

Resuelto boutta asked hace 15 años • 37 respuestas

Tengo una construcción de bucle anidado como este:

for (Type type : types) {
    for (Type t : types2) {
         if (some condition) {
             // Do something and break...
             break; // Breaks out of the inner loop
         }
    }
}

Ahora, ¿cómo puedo salir de ambos bucles? He analizado preguntas similares, pero ninguna se refiere específicamente a Java. No pude aplicar estas soluciones porque la mayoría usaba gotos.

No quiero poner el bucle interno en un método diferente.

No quiero devolver los bucles. Al romper, termino con la ejecución del bloque de bucle.

boutta avatar May 20 '09 16:05 boutta
Aceptado

Al igual que otros respondedores, definitivamente preferiría poner los bucles en un método diferente, momento en el cual puedes volver a dejar de iterar por completo. Esta respuesta solo muestra cómo se pueden cumplir los requisitos de la pregunta.

Puedes usarlo breakcon una etiqueta para el bucle exterior. Por ejemplo:

public class Test {
    public static void main(String[] args) {
        outerloop:
        for (int i=0; i < 5; i++) {
            for (int j=0; j < 5; j++) {
                if (i * j > 6) {
                    System.out.println("Breaking");
                    break outerloop;
                }
                System.out.println(i + " " + j);
            }
        }
        System.out.println("Done");
    }
}

Esto imprime:

0 0
0 1
0 2
0 3
0 4
1 0
1 1
1 2
1 3
1 4
2 0
2 1
2 2
2 3
Breaking
Done
Jon Skeet avatar May 20 '2009 09:05 Jon Skeet

Técnicamente, la respuesta correcta es etiquetar el bucle exterior. En la práctica, si desea salir en cualquier punto dentro de un bucle interno, sería mejor que externalice el código en un método (un método estático si es necesario) y luego lo llame.

Eso compensaría la legibilidad.

El código quedaría algo así:

private static String search(...) 
{
    for (Type type : types) {
        for (Type t : types2) {
            if (some condition) {
                // Do something and break...
                return search;
            }
        }
    }
    return null; 
}

Coincidiendo con el ejemplo de la respuesta aceptada:

 public class Test {
    public static void main(String[] args) {
        loop();
        System.out.println("Done");
    }

    public static void loop() {
        for (int i = 0; i < 5; i++) {
            for (int j = 0; j < 5; j++) {
                if (i * j > 6) {
                    System.out.println("Breaking");
                    return;
                }
                System.out.println(i + " " + j);
            }
        }
    }
}
Zo72 avatar Nov 14 '2011 18:11 Zo72

Puedes usar un bloque con nombre alrededor de los bucles:

search: {
    for (Type type : types) {
        for (Type t : types2) {
            if (some condition) {
                // Do something and break...
                break search;
            }
        }
    }
}
Joey avatar May 20 '2009 09:05 Joey