Java | Aus einer verschachtelten Schleife ausbrechen ohne Labels/Markierungen?

4 Antworten

Das wäre einer der wenigen Fälle, wo ich das Verwenden von Sprungzielen für gerechtfertigt halte - solange die Sprache kein adäquates Mittel zur Verfügung stellt.

Ohne Labels kann man eine boolesche Variable setzen und nach jedem Schleifenausgang darauf testen.

Woher ich das weiß:Berufserfahrung – Software-Entwickler

 das break nur die innerste Schleife beendet

korrekt. 

Und ich wollte euch fragen wie man aus einer verschachtelten Schleife ausbricht.

Da gib es mehrere Optionen.

ohne Labels/Markierungen

Durch solche Vorgaben machst du es dir allerdings schwerer.

Ich liste daher trotzdem mal einige Beispiele auf und nehme hier als einfachstes Szenario: Das durchlaufen einer 2D-Array:

int[][] exampleArray = new int[3][3];

for (int i = 0; i < exampleArray.length; i++) { for (int j = 0; j < exampleArray[i].length; j++) { System.out.println("i = " + i + "; j = " + j); } }

Die leichteste Option: Du benennst deine Schleifen und verwendest ein break für die jeweilige Schleife:

outerloop:
for (int i = 0; i < exampleArray.length; i++) {
    innerloop:
    for (int j = 0; j < exampleArray[i].length; j++) {
        if (j==1) {
            break outerloop;
        }
        System.out.println("i = " + i + "; j = " + j);
    }
}

Du verpackst deine Schleife in eine Methode und führst einen Return aus.

private void test() {
    int[][] exampleArray = new int[3][3];
    for (int i = 0; i < exampleArray.length; i++) {
        for (int j = 0; j < exampleArray[i].length; j++) {
            if (j == 1) {
                return;
            }
            System.out.println("i = " + i + "; j = " + j);
        }
    }
}

Eher untypisch aber möglich: Du formulierst eine Variable, die zum beenden einer Schleife führt:

boolean breakLoop = false;
for (int i = 0; i < exampleArray.length && !breakLoop; i++) {
    for (int j = 0; j < exampleArray[i].length && !breakLoop; j++) {
        if (j == 1) {
            breakLoop = true;
            continue;
        }
        System.out.println("i = " + i + "; j = " + j);
    }
}

Indem du eine Schleife nach der nächsten, ausgehend von der Inneren, mit break beendest. Dabei muss die innere Schleife eine Schaltervariable setzen, die außerhalb abgeprüft werden kann. Noch eleganter wäre es in vielen Fällen allerdings, die innere Schleife in eine Helfermethode auszulagern, welche einen Wahrheitswert zurückgibt. Dies reduziert Verschachtelungen.

 for(int i = 0; i < n; ++i){
   if(executeInnerLoop()){
     break;
   }
 }

// .... boolean executeInnerLoop(){ /* ... */ }

Ohne Labels kannst du noch mit return ausbrechen.