2082 Stimmen

Wie kann ich in Java aus verschachtelten Schleifen ausbrechen?

Ich habe ein verschachteltes Schleifenkonstrukt wie dieses:

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

Wie kann ich nun aus beiden Schleifen ausbrechen? Ich habe mir ähnliche Fragen angesehen, aber keine davon betrifft speziell Java. Ich konnte diese Lösungen nicht anwenden, weil die meisten gotos verwendeten.

Ich möchte die innere Schleife nicht in eine andere Methode einfügen.

Ich möchte die Schleifen nicht zurückgeben. Beim Abbrechen bin ich mit der Ausführung des Schleifenblocks fertig.

2754voto

Jon Skeet Punkte 1325502

Wie andere Antwortende würde ich auf jeden Fall lieber um die Schleifen in eine andere Methode einzubinden. Dann können Sie einfach zurückkehren, um die Iteration vollständig zu beenden. Diese Antwort zeigt nur, wie die Anforderungen der Frage erfüllt werden können.

Sie können verwenden break mit einer Bezeichnung für die äußere Schleife. Zum Beispiel:

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");
    }
}

Dies wird gedruckt:

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

439voto

Zo72 Punkte 13803

Technisch gesehen ist die richtige Antwort, die äußere Schleife zu beschriften. Wenn Sie in der Praxis an einem beliebigen Punkt innerhalb einer inneren Schleife aussteigen wollen, sollten Sie den Code besser in eine Methode (ggf. eine statische Methode) auslagern und diese dann aufrufen.

Das würde sich für die Lesbarkeit auszahlen.

Der Code würde in etwa so aussehen:

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

Übereinstimmung mit dem Beispiel für die akzeptierte Antwort:

 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);
            }
        }
    }
}

241voto

Joey Punkte 329386

Sie können einen benannten Block um die Schleifen herum verwenden:

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

157voto

Elle Mundy Punkte 2051

Ich verwende nie Etiketten. Das scheint mir eine schlechte Praxis zu sein. Ich würde Folgendes tun:

boolean finished = false;
for (int i = 0; i < 5 && !finished; i++) {
    for (int j = 0; j < 5; j++) {
        if (i * j > 6) {
            finished = true;
            break;
        }
    }
}

127voto

simon622 Punkte 3148

Sie können Etiketten verwenden:

label1: 
for (int i = 0;;) {
    for (int g = 0;;) {
      break label1;
    }
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X