W3docs

Java for-Schleife

Iteration mit der Java for-Schleife: Initialisierung, Bedingung und Update-Ausdruck kompakt in einem Header zusammengefasst.

Die for-Schleife ist das Arbeitstier der Java-Iteration. Sie bündelt drei Bestandteile — was vor der Schleife getan wird, was vor jeder Iteration geprüft wird und was nach jeder Iteration geschieht — in einem einzigen Header. Das Ergebnis ist kompakter und weniger fehleranfällig als die gleiche Logik mit while.

Syntax

for (initialization; condition; update) {
  // body
}

Drei durch Semikolons getrennte Teile:

  1. Initialisierung — wird einmalig ausgeführt, bevor die Schleife startet. Typischerweise wird hier der Zähler deklariert.
  2. Bedingung — wird vor jeder Iteration geprüft. Ist sie false, endet die Schleife.
  3. Update — wird nach jeder Iteration ausgeführt. Typischerweise wird hier der Zähler erhöht.
for (int i = 0; i < 5; i++) {
  System.out.println(i);
}

Gibt 0 1 2 3 4 aus. Der Header liest sich als: starte mit i = 0, läuft solange i < 5, erhöhe i jedes Mal.

Äquivalente while-Form

Eine for-Schleife ist mechanisch äquivalent zu dieser while-Schleife:

{
  int i = 0;            // initialization
  while (i < 5) {       // condition
    System.out.println(i);
    i++;                // update
  }
}

Der Vorteil von for ist, dass alles, was die Schleife steuert, in einer einzigen Zeile steht, wodurch die Absicht auf einen Blick erkennbar ist.

Zählvariationen

Der for-Header ist flexibel. Die drei Teile können beliebig sein:

// counting down
for (int i = 10; i > 0; i--) { ... }

// stepping by 2
for (int i = 0; i < 100; i += 2) { ... }

// looping over an array by index
for (int i = 0; i < arr.length; i++) {
  System.out.println(arr[i]);
}

Wird ein bestimmter Teil nicht benötigt, kann er weggelassen werden — die Semikolons müssen jedoch erhalten bleiben:

for (;;) {              // identical to while (true)
  if (done()) break;
}

Der Off-by-one-Fehler

Der häufigste for-Schleifen-Fehler ist die Wahl des falschen Vergleichsoperators. Beim Indizieren eines Arrays der Länge n gehen gültige Indizes von 0 bis n - 1, daher muss die Bedingung i < n lauten (nicht i <= n):

int[] arr = {10, 20, 30};   // length 3, indices 0..2
for (int i = 0; i <= arr.length; i++) {
  System.out.println(arr[i]);   // throws ArrayIndexOutOfBoundsException when i == 3
}

Das Ersetzen von <= durch < behebt das Problem. Eine einfache Regel: < bei einer Anzahl oder length verwenden und <= für einen expliziten letzten Wert reservieren (z. B. for (int i = 1; i <= 5; i++)).

Gültigkeitsbereich der Schleifenvariable

Eine in der Initialisierungsklausel deklarierte Variable ist lokal zur Schleife. Nach dem Ende der Schleife ist sie nicht mehr vorhanden:

for (int i = 0; i < 5; i++) {
  // i is visible here
}
// i is not visible here

Das ist beabsichtigt — es verhindert, dass man versehentlich auf den Endwert des Zählers angewiesen ist. Wird der Wert außerhalb der Schleife benötigt, muss die Variable vorher deklariert werden:

int i;
for (i = 0; i < 5; i++) {
  if (someCondition(i)) break;
}
System.out.println("stopped at i=" + i);

Mehrere Variablen in einem Header

Es können mehrere Variablen deklariert und aktualisiert werden, getrennt durch Kommas:

for (int i = 0, j = 10; i < j; i++, j--) {
  System.out.println(i + " " + j);
}

Gelegentlich nützlich — wenn eine Schleife jedoch mehr als zwei interagierende Variablen benötigt, ist das meist ein Zeichen dafür, den Code in kleinere Teile umzustrukturieren.

Wann for statt while verwenden

Eine for-Schleife empfiehlt sich, wenn man weiß — oder in einer Zeile ausdrücken kann — wie viele Iterationen benötigt werden oder welcher Bereich durchlaufen wird. Eine while-Schleife ist besser geeignet, wenn die Abbruchbedingung nicht an einen Zähler gebunden ist (z. B. „bis die Eingabe erschöpft ist", „bis zum Erfolg").

Zum elementweisen Durchlaufen eines Arrays oder einer Collection ist die erweiterte for-each-Schleife fast immer übersichtlicher.

Ein ausgearbeitetes Beispiel

java— editable, runs on the server

Was kommt als Nächstes

Wenn nur jedes Element eines Arrays oder einer Collection besucht werden soll, ohne einen Index zu verwalten, ist die for-each-Schleife das richtige Werkzeug.

Übungen

Übung
Was gibt for (int i = 0; i < 5; i += 2) System.out.print(i); aus?
Was gibt for (int i = 0; i < 5; i += 2) System.out.print(i); aus?
Was this page helpful?