While-Schleife
Bild: Taylor, CC BY-SA 4.0, Wikimedia Commons
Kurz: Eine kopfgesteuerte Schleife, die läuft, solange eine Bedingung wahr ist — die Anzahl der Durchläufe muss vorher nicht feststehen.
Genauer: Die Bedingung wird VOR jedem Durchlauf geprüft; ist sie beim ersten Check schon falsch, läuft der Schleifenkörper kein einziges Mal. Eignet sich für Fälle, in denen die Abbruchbedingung von etwas Dynamischem abhängt (z. B. Nutzereingabe), nicht von einem festen Zähler wie bei der for-Schleife.
int i = 0;
while (i < 5) {
System.out.println(i);
i++;
}Im Detail
Scanner scanner = new Scanner(System.in);
String eingabe;
while (!(eingabe = scanner.nextLine()).equals("stop")) {
System.out.println("Du hast eingegeben: " + eingabe);
}
System.out.println("Beendet.");Weil die Bedingung VOR jedem Durchlauf geprüft wird (“kopfgesteuert”), eignet sich while besonders für Fälle, bei denen die Anzahl der nötigen Durchläufe vorher nicht bekannt ist und theoretisch auch null sein kann — etwa beim Warten auf eine bestimmte Nutzereingabe (wie oben) oder beim Verarbeiten einer Datei, bei der man nicht im Voraus weiß, wie viele Zeilen sie hat (while ((zeile = reader.readLine()) != null) { ... }). Ein häufiger Fehler ist eine Bedingung, die sich innerhalb des Schleifenkörpers niemals ändert — die Schleife läuft dann endlos weiter, bis das Programm manuell abgebrochen oder der Speicher erschöpft wird.
Java kennt zwei enge Verwandte von while: das do-while (prüft die Bedingung NACH statt vor dem Durchlauf, garantiert also mindestens einen Durchlauf) und die for-Schleife (kombiniert Initialisierung, Bedingung und Update in einem Schleifenkopf, üblich bei bekannter, fester Anzahl an Durchläufen). Praktisch jede while-Schleife lässt sich als for-Schleife umschreiben und umgekehrt — die Wahl ist meist eine Frage der Lesbarkeit, nicht der technischen Möglichkeit.
Endlosschleifen als bewusstes Muster
Nicht jede while (true)-Konstruktion ist ein Bug — manche Programme (z. B. Server, die dauerhaft auf Anfragen warten) nutzen eine bewusste Endlosschleife und verlassen sie gezielt über break an einer bestimmten Stelle innerhalb des Schleifenkörpers, statt die Abbruchbedingung im Schleifenkopf zu formulieren:
while (true) {
String befehl = scanner.nextLine();
if (befehl.equals("stop")) {
break; // gezielter Ausstieg mitten im Schleifenkörper
}
verarbeite(befehl);
}Das ist besonders dann sinnvoll, wenn die Abbruchbedingung erst NACH einem Teil der Verarbeitung im Schleifenkörper feststeht, statt sauber vorne im Schleifenkopf formulierbar zu sein.
Verschachtelte while-Schleifen und break/continue mit Labels
Bei verschachtelten Schleifen bricht ein einfaches break nur aus der innersten Schleife aus — um gezielt aus einer äußeren Schleife auszubrechen, unterstützt Java benannte Labels: aussen: while (...) { while (...) { if (bedingung) break aussen; } }. Dieses Muster wird in der Praxis selten gebraucht und oft als Hinweis gewertet, dass sich die Logik durch eine eigene Methode mit einem regulären return klarer ausdrücken ließe.
Siehe auch: Schleifen, For-Schleife, do-while-Schleife, Kopfgesteuerte Schleife, Break/Continue