Schleifen
Neben if-else-Anweisungen sind Schleifen eine der wichtigsten syntaktischen Möglichkeiten in Java, um Programmabläufe zu steuern. Die Idee der Schleife ist dabei sehr einfach: Eine oder mehrere Anweisungen sollen immer wieder ausgeführt werden, bis eine Abbruchbedingung erfüllt ist.
(1) while-Schleife
Die einfachste Form der Schleife, die sog. while-Schleife, sieht in Java aus wie hier:
Die Syntax ähnelt stark der Syntax von if-Anweisungen: innerhalb von runden Klammern wird die Bedingung angegeben, die geprüft werden soll, und innerhalb von geschweiften Klammern stehen die Anweisungen, die ausgeführt werden sollen, solange die Bedingung erfüllt ist. Die Bedingung wird dabei immer überprüft, bevor eine Iteration der Schleife ausgeführt wird - innerhalb einer Ausführung des while-Blocks kann die Bedingung verletzt werden, ohne dass die while-Schleife sofort verlassen wird, wie in folgendem Beispiel:
Die Bedingung ist, dass die Variable zahl einen Wert haben muss, der kleiner als 3 ist. Im ersten Durchlauf ist dies der Fall (zahl = 0), und innerhalb der while-Schleife wird die Variable um 1 erhöht. Vor dem dritten Durchlauf hat die Variable zahl den Wert 2, der in der Schleife auf 3 erhöht wird, so dass die Bedingung nicht mehr erfüllt wird. Trotzdem wird der Inhalt des while-Blocks noch abgearbeitet und die Ausgabe 'Zahl: 3' ausgegeben:
Ähnlich wie bei if-else-Konstruktionen ist hier außerdem, dass Schleifen wiederum Schleifen enthalten können:
Da sich beide Konstruktionen sehr ähnlich sind, ist es nicht verwunderlich, dass sie auch kombiniert werden können, so dass Schleifen innerhalb von if-else-Blöcken genutzt werden dürfen und umgekehrt. Bedingung ist jedoch immer, dass sie innerhalb einer Methode definiert werden - aber eine Schleife oder eine if-Anweisung außerhalb einer Methode wäre auch nicht besonders sinnvoll. Neben der while-Schleife gibt es noch andere Formen...
(2) do-while-Schleife
Die do-while-Schleife ist sehr ähnlich zur while-Schleife, überprüft eine Bedingung jedoch nicht vor, sondern nach einem Durchlauf durch die Anweisungen:
In diesem Beispiel arbeitet das Programm genauso wie mit der while-Schleife (d.h. es werden die Zahlen von 1 bis 3 ausgegeben), dies muss jedoch nicht immer der Fall sein: Wenn es notwendig ist, dass eine Schleife mindestens einmal durchlaufen wird, kann dies mit einer do-while-Schleife garantiert werden. Eine while-Schleife wird u.U. nie durchlaufen, eine do-while-Schleife mindestens einmal. Das folgende Programm veranschaulicht dies:
Die Ausgabe ist...
(3) for-Schleife
Die for-Schleife ist die 'mächtigste' aller Schleifen in Java und wird am häufigsten verwendet, da sie - wenn man sich erst an die Syntax gewöhnt hat - Programme übersichtlicher macht. Sehr häufig werden Schleifen so eingesetzt, dass zunächst die (1) Zählervariable initialisiert wird, diese einer (2) Abbruchbedingung unterliegt und in jedem Durchlauf durch die Schleife (3) modifiziert bzw. inkrementiert wird.
Diese drei Elemente einer Schleife werden in der Deklaration der for-Schleife zusammengefasst, was sich abstrakt darstellen lässt wie folgt:
Das obige Programm lässt sich auf wenige Zeilen Code reduzieren, wenn eine for-Schleife eingesetzt wird:
Wichtig ist, dass die drei Elemente der for-Schleife durch Semikola voneinander getrennt werden - eine for-Schleife muss immer Initialisierung, Abbruchbedingung und Inkrementierung (in dieser Reihenfolge) enthalten, andernfalls lässt sich das Programm nicht kompilieren. Es ist jedoch möglich, die Elemente der for-Schleife leer zu lassen und lediglich die Semikola anzugeben:
Dies ist allerdings i.d.R. nicht sinnvoll - wenn eine for-Schleife benutzt wird, so sollten auch Initialisierung, Abbruchbedingung und Inkrementierung der relevanten Variablen in den dafür vorgesehen 'Feldern' des for-Ausdrucks angegeben werden. Andernfalls ist eine while-Schleife für das zu lösende Problem vermutlich besser geeignet.
(4) Endlosschleifen und das Schlüsselwort "break"
Theoretisch ist es möglich, eine Schleife zu definieren, die nie verlassen wird:
Lassen Sie dieses Programm nicht laufen! Sie können es zwar mit Hilfe des Terminate-Buttons in der Console von Eclipse beenden, doch reagiert Eclipse mitunter etwas schwerfällig, wenn ein Programm in einer Endlosschleife steckenbleibt und dabei viele Ausgaben auf der Console produziert. Das Schlüsselwort true ist eine zulässige Bedingung, die allerdings nie falsch werden kann (ebenso wie false eine Bedingung ist, die nie wahr werden kann) - das Programm würde also nie abbrechen. Um die Schleife trotzdem verlassen zu können, gibt es das Schlüsselwort break. Eine letzte Variante des Zahlen-Programms mit Endlosschleife und break sieht so aus:
Die Abbruchbedingung wird hier innerhalb der while-Schleife durch die if-Anweisung überprüft, und falls zahl den Wert 3 erreicht hat, wird die Schleife durch die Anweisung break verlassen. Unter Umständen ist dieses Vorgehen sinnvoll, bspw. dann, wenn die Abbruchbedingung relativ kompliziert aussieht, weil verschiedene Faktoren eine Rolle spielen, und es das Programm unübersichtlich machen würde, alle Faktoren in den runden Klammern der while-Schleife zu überprüfen. Oftmals sind Endlos-Schleifen jedoch ungewollt und es handelt sich um einen Programmierfehler, weil bspw. eine Variable wie zahl versehentlich nicht hochgezählt und die Abbruchbedingung so nie erreicht wird. In einigen wenigen Fällen werden Sie von Eclipse auf ungewollte Endlosschleifen hingewiesen: Wenn der Compiler erkennen kann, das eine Abbruchbedingung nie erreicht wird, Sie jedoch nach der Schleife weiteren Code schreiben, so erscheint die Fehlermeldung
Unreachable code
Dies ist allerdings nur in wenigen Situationen der Fall - bspw. dann, wenn Sie in obigem Programm die if-Abfrage und den break-Befehl entfernen. Wenn Sie hingegen in einem der anderen Beispiele die Modifikation zahl = zahl + 1; löschen, so wird Eclipse Sie nicht darauf hinweisen, dass die Schleife nicht verlassen wird und Code hinter der Schleife nicht erreichbar ist. Ein Definitionsbereich von Variablen kennen Sie bereits die Unterscheidung von Attributen und 'normalen' Variablen, die innerhalb einer Methode verwendet werden: Auf Letztere kann nur innerhalb dieser Methode zugegriffen werden, während auf Objekt-Attribute von allen Methoden des Objekts zugegriffen werden kann. Mit der Einführung von Schleifen und Kontrollstrukturen wird der Definitionsbereich noch einmal unterteilt: Variablen, die innerhalb eines if-Blocks deklariert werden, sind nur in diesem zugänglich, und das gleiche gilt auch für Variablen, die innerhalb einer Schleife deklariert werden. Die beiden Variablen i und quadrat in folgendem Beispiel ...
... gehören zum Körper der for-Schleife, und dort lassen sie sich auch benutzen. Außerhalb der Schleife sind sie jedoch nicht bekannt, so dass das Programm nicht übersetzt werden kann. Generell gilt: Der Definitionsbereich einer Variable (mit Ausnahme von Objekt-Attributen) ist immer durch zwei geschweifte Klammern beschränkt, und nur innerhalb dieser Klammern lässt sich auf die Variable zugreifen. Falls es notwendig ist, dass außerhalb einer Schleife oder einer if-Anweisung auf eine Variable zugegriffen werden kann, die dort benutzt wird, so muss diese Variable außerhalb des Blocks deklariert werden, wie hier die Variable quadrat: