Titel | Inhalt | Suchen | Index | DOC | Handbuch der Java-Programmierung, 3. Auflage
<< | < | > | >> | API | Kapitel 6 - Anweisungen

## 6.3 Schleifen

- 6.3 Schleifen
  - 6.3.1 Die while-Schleife
    - Syntax
    - Bedeutung
  - 6.3.2 Die do-Schleife
    - Syntax
    - Bedeutung
  - 6.3.3 Die for-Schleife
    - Syntax
    - Bedeutung
    - break und continue

Java besitzt die drei üblichen Schleifenanweisungen prozeduraler Programmiersprachen: eine nichtabweisende, eine abweisende und eine Zählschleife. Die Syntax und Semantik der Schleifen ist fast vollständig identisch zu den entsprechenden Anweisungen in C.

### 6.3.1 Die while-Schleife

#### Syntax

    while (ausdruck)
      anweisung;

#### Bedeutung

Zuerst wird der Testausdruck, der vom Typ `boolean` sein muß, geprüft. Ist er `true`, wird die Anweisung ausgeführt, andernfalls wird mit der ersten Anweisung hinter der Schleife weitergemacht. Nachdem die Anweisung ausgeführt wurde, wird der Testausdruck erneut geprüft usw. Die Schleife wird beendet, sobald der Test `false` ergibt.

### 6.3.2 Die do-Schleife

#### Syntax

    do
      anweisung;
    while (ausdruck);

#### Bedeutung

Die `do`-Schleife arbeitet nichtabweisend, d.h. sie wird mindestens einmal ausgeführt. Da zunächst die Schleifenanweisung ausgeführt und erst dann der Testausdruck überprüft wird, kann die `do`-Schleife frühestens nach einem Durchlauf regulär beendet werden. Die Bearbeitung der Schleife wird immer dann beendet, wenn der Test des Schleifenausdrucks `false` ergibt.

### 6.3.3 Die for-Schleife

#### Syntax

    for (init; test; update)
      anweisung;

#### Bedeutung

Der Kopf der `for`-Schleife besteht aus drei Ausdrücken, die jeder für sich optional sind:

- Der init-Ausdruck wird einmal vor dem Start der Schleife aufgerufen. Er dient dazu, Initialisierungen durchzuführen, die durch die Auswertung von Ausdrücken mit Nebeneffekten verursacht werden. Der Rückgabewert der Ausdrücke wird vollständig ignoriert.
- Der init-Teil darf auch aus mehreren Ausdrücken bestehen, wenn die einzelnen Teilausdrücke durch Kommata getrennt sind. Diese syntaktische Erweiterung ist allerdings nur innerhalb des Initialisierungsteils einer `for`-Schleife erlaubt. Einen allgemeinen Komma-Operator (wie in C und C++) gibt es in Java nicht.
- Fehlt der Initialisierungsteil, wird keine Initialisierung im Kopf der Schleife durchgeführt.
- Der init-Teil darf auch Variablendeklarationen enthalten, beispielsweise, um einen Schleifenzähler zu erzeugen. Die Variablen müssen bei der Deklaration initialisiert werden. Sichtbarkeit und Lebensdauer erstrecken sich auf den Block, der die Schleifenanweisungen enthält. Damit ist es möglich, den Namen einer Schleifenvariablen innerhalb einer Methode mehrfach zu deklarieren.
- Der test-Teil bildet den Testausdruck der Schleife. Analog zur while-Schleife wird er am Anfang der Schleife ausgeführt, und die Schleifenanweisung wird nur ausgeführt, wenn die Auswertung des Testausdrucks true ergibt. Fehlt der Testausdruck, so setzt der Compiler an seiner Stelle die Konstante `true` ein.
- Der update-Ausdruck dient dazu, den Schleifenzähler zu verändern. Er wird nach jedem Durchlauf der Schleife ausgewertet, bevor der Testausdruck das nächste Mal ausgewertet wird. Wie der init-Teil darf auch der update-Teil aus mehreren Ausdrücken bestehen. Der Rückgabewert des Ausdrucks wird ignoriert. Fehlt der update-Ausdruck, so wird keine automatische Modifikation des Schleifenzählers durchgeführt.

#### break und continue

In Java gibt es zwei weitere Möglichkeiten, die normale Auswertungsreihenfolge in einer Schleife zu verändern. Taucht innerhalb einer Schleife eine `break`-Anweisung auf, wird die Schleife verlassen und das Programm mit der ersten Anweisung nach der Schleife fortgesetzt. Taucht dagegen eine `continue`-Anweisung auf, springt das Programm an das Ende des Schleifenrumpfs und beginnt mit der nächsten Iteration.

In der einfachsten Form arbeiten `break` und `continue` genauso wie in C und C++. Beide Anweisungen können innerhalb von `do`-, `while`- und `for`-Schleifen verwendet werden. Befindet sich ein `break` innerhalb einer mehrfach geschachtelten Schleife, so verläßt es die innerste Schleife. Dies gilt analog für `continue`. Neben dieser einfachen Form von `break` und `continue` gibt es in Java noch die mit einem Label versehene Form:

    break Label;

    continue Label;

Zu jedem mit einem Label versehenen `break` oder `continue` muß es eine mit einem Label versehene Kontrollstruktur geben, die diese Anweisung umschließt. Oft wird ein mit einem Label versehenes `break` verwendet, um zwei oder mehr ineinander geschachtelte Schleifen zu beenden:

    001 /* Listing0606.java */
    002
    003 import java.io.*;
    004
    005 public class Listing0606
    006 {
    007   public static void main(String[] args)
    008   {
    009     int[][] data = new int[10][10];
    010
    011     //Multiplikationstafel erstellen
    012     for (int i = 1; i <= 10; ++i) {
    013       for (int j = 1; j <= 10; ++j) {
    014         data[i - 1][j - 1] = i * j;
    015       }
    016     }
    017
    018     //Produkt größer 43 suchen
    019   loop1:
    020     for (int i = 1; i <= 10; ++i) {
    021       for (int j = 1; j <= 10; ++j) {
    022         if (data[i - 1][j - 1] > 43) {
    023           System.out.println(i + "*" + j + "=" + (i*j));
    024           break loop1;
    025         }
    026       }
    027     }
    028   }
    029 }
| Listing0606.java

Listing 6.6: Das gelabelte break

Das Programm erstellt zunächst eine Multiplikationstafel für die Zahlen von 1 bis 10. Ab Zeile 018 sucht es dann in einer geschachtelten Schleife nach den ersten beiden Faktoren, deren Produkt 43 übersteigt. Die äußere der beiden Schleifen hat das Label `loop1`, die innere ist ohne Label. Wenn die Anweisung `break loop1;` ausgeführt wird, springt das Programm an das Ende des mit dem Label `loop1` markierten Anweisungsblocks, also hinter die geschweifte Klammer in Zeile 027. Hätten wir ein ungelabeltes `break` verwendet, wäre das Programm lediglich bis an das Ende von Zeile 026 gesprungen, und die äußere Schleife hätte eine weitere Iteration durchgeführt.

Vollkommen analog zu der mit einem Label versehenen `break`-Anweisung kann auch die mit einem Label versehene Form der `continue`-Anweisung verwendet werden, um die nächste Iteration einer weiter außen liegenden Schleife einzuleiten.

|  | Die `break`- und `continue`-Anweisungen, insbesondere die mit einem Label versehenen, stellen Sprunganweisungen dar. Im Vergleich zu den `goto`-Anweisungen anderer Programmiersprachen sind ihr Fähigkeiten aber auf kontrollierte Sprünge in Schleifenanweisungen beschränkt. Eine allgemeine Sprunganweisung gibt es in Java nicht (die Sprachdesigner haben sich aber scheinbar ein Hintertürchen offengelassen und `goto` zu einem reservierten Wort erklärt). |  |
Hinweis

Die Bedeutung von gelabelten `break`- und `continue`-Anweisungen ist in der Praxis nicht so groß, wie man vermuten könnte. Unbedacht eingesetzt, können sie die Lesbarkeit eines Programmes sogar vermindern. Eine weitere nützliche Anwendung des gelabelten `break` besteht darin, eine Schleife aus einer darin liegenden `switch`-Anweisung zu verlassen.

Titel | Inhalt | Suchen | Index | DOC | Handbuch der Java-Programmierung, 3. Auflage, Addison Wesley, Version 3.0
<< | < | > | >> | API | © 1998-2002 Guido Krüger, http://www.javabuch.de