Kontrollstrukturen
Schleifen
Bedingte Anweisungen
Behandlung von Ausnahmen
Kontrollstrukturen in Programmen ermöglichen es, von der sequentiellen Abarbeitung von Programmzeilen abzuweichen. So können beispielsweise bestimmte Anweisungsblöcke wiederholt (realisiert mit Schleifen) oder nur unter gewissen Bedingungen (realisiert mit bedingten Anweisungen) ausgeführt werden.
Schleifen, bedingte Anweisungen und try-Anweisungen können ineinander verschachtelt und miteinander verknüpft werden (→ Javaprojekt SortingAlgorithms).
Schleifen dienen dazu, eine einzelne Anweisung bzw. Anweisungsblöcke
wiederholt auszuführen.
for-Schleifen.
for (ForInit; expr; ForUpdate) Block
ForInit besteht aus einer Anweisung oder mehreren, durch Kommata abgetrennten Anweisungen, die zuallererst (von links nach rechts) ausgeführt werden. Danach folgt der erste Iterationsschritt (iteration step): Abarbeitung der im Anweisungsblock Block stehenden Anweisungen, unmittelbar gefolgt von der Anweisung bzw. den Anweisungen in ForUpdate. Dieser Iterationsschritt wird solange wiederholt, bis der Ausdruck expr den Wert false liefert (→ Javaprojekt ColoredGrid).
Ein einfaches Beispiel:
for (int i=0; i<10; i++) {
System.out.println(i);
}
Ein zweites Beispiel:
for (int i=3,j=4; i<9 || i*j<150; i+=2,j++) {
System.out.println(i*j);
}
for-each-Schleifen.
Soll ein bestimmter Vorgang mit sämtlichen Elementen eines Arrays oder einer Liste durchgeführt werden, so kann dieses mit einer for-Schleife, aber auch mit einer for-each-Schleife programmiert werden. Ein einfaches Beispiel:
char[] array = {'a', 'b', 'c'};
// for-Schleife
for (int i=0;
i<array.length; i++)
System.out.print(array[i]);
// liefert die Ausgabe: abc
// for-each-Schleife
for (char chr: array)
System.out.print(chr);
// liefert die Ausgabe: abc
In der Klasse java.util.ArrayList (und etlichen anderen) ist das Interface Iterable implementiert. Das bedeutet, dass zu jeder Instanz dieser Klasse insbesondere die Methode forEach gehört, deren Bedeutung im folgenden Beispiel unter Verwendung eines Lambda-Ausdrucks illustriert werden soll:
ArrayList<Character> list = new ArrayList<Character>();
for
(int i=97; i<100; i++) list.add((char) i);
list.forEach(element -> System.out.print(element));
// liefert die Ausgabe: abc
while-Schleifen.
while expr Block
Die im Anweisungsblock Block stehenden Anweisungen werden wiederholt ausgeführt solange
der Ausdruck expr den Wert true
liefert. expr wird erstmals ausgewertet, bevor der erste Iterationsschritt gestartet wird.
do-while-Schleifen.
do Block while expr
Die im Anweisungsblock Block stehenden Anweisungen werden wiederholt ausgeführt solange der Ausdruck expr den Wert true liefert. expr wird erstmals ausgewertet, nachdem der erste Iterationsschritt beendet wurde.
Nach der Anweisung break; im Anweisungsblock einer Schleife wird die Schleife verlassen und es folgt die Abarbeitung der ersten Anweisung direkt nach der Schleife. Nach der Anweisung continue; im Anweisungsblock einer Schleife wird der aktuelle Schleifenschritt abgebrochen und es wird der jeweils nächste Schleifenschritt begonnen.
Ein Beispiel:
int j = 8;
float z;
while (j > -16) {
j -= 2;
if (j == 0) continue;
z = 24.0f/j;
System.out.println(24/j + " " + z);
}
Mit einer bedingten Anweisung in Form einer if-Anweisung kann man eine einseitige Verzweigung, in
Form einer if-else-Anweisung eine zweiseitige Verzweigung und in Form einer switch-Anweisung eine
Auswahlstruktur implementieren:
if-Anweisungen.
if expr Block
Falls der Ausdruck expr den Wert true liefert, werden die Anweisungen im Anweisungsblock Block ausgeführt, andernfalls passiert nichts.
if-else-Anweisungen.
if expr Block1 else Block2
Falls der Ausdruck expr den Wert true liefert, werden die Anweisungen im Anweisungsblock Block1 ausgeführt, andernfalls die im Anweisungsblock Block2.
switch-Anweisungen.
switch(v) {
case
value_1: BreakBlock1
case value_2: BreakBlock2
...
case value_j:
BreakBlockj
...
default: DefaultBlock
}
Ist die Variable v mit dem Wert value_j belegt, so verzweigt das Programm nach Erreichen der switch-Anweisung zur entsprechenden case-Zeile und es werden die Anweisungen des Auswahlblocks BreakBlockj ausgeführt. Enthält die Variable v keinen der Werte value_1, value_2, ..., so verzweigt das Programm zur default-Zeile und es werden die Anweisungen im Auswahlblock DefaultBlock abgearbeitet.
Am Ende aller BreakBlöcke muss zwingend die Anweisung break; stehen, damit das Programm schließlich zum Ende der switch-Anweisung verzweigt (→ Javaprojekt SortingAlgorithms).
Treten in einem Programmteil durch einen Programmfehler Ausnahmen (exceptions) ein, so können diese Fehler gegebenenfalls abgefangen werden (→ Javaprojekt InputDialog).
try-Anweisungen.
try Block catch (ExceptionTyp exc) Handling
Wird durch eine Anweisung im Anweisungsblock Block ein Fehler ausgelöst, mit anderen Worten: tritt durch eine fehlerhafte Anweisung zur Laufzeit des Programms eine Ausnahme ein, wird ein Ausnahmeobjekt exc „geworfen“ (an exception is thrown) und mittels der catch-Klausel eingefangen. Entspricht der Typ von exc dem in der catch-Klausel deklarierten Typ ExceptionTyp, so werden die Anweisungen im Anweisungsblock Handling abgearbeitet. Die Anweisungen in Handling haben die Aufgabe, den aufgetretenen Fehler zu reparieren oder wenigstens zu umgehen.
Entspricht der Typ von exc nicht dem in der catch-Klausel deklarierten Typ ExceptionTyp oder ist die Ausnahme durch die Handling-Anweisungen nicht beseitigt, so bricht das Programm möglicherweise mit einer Fehlermeldung ab.
In einer try-Anweisung können mehrere verschiedene catch-Klauseln nacheinander formuliert werden.
Es ist zudem möglich, auf Ausnahmeobjekte verschiedenen Typs mit denselben Handling-Anweisungen zu reagieren:
try Block catch (ExceptionTyp1 exc1 | ExceptionTyp2 exc2) Handling
Optional ist ein finally-Block, dessen Anweisungen nach einer erfolgreichen Fehlerbehandlung ausgeführt werden:
try Block catch (ExceptionTyp exc) Handling finally FinalBlock
ExceptionTyp repräsentiert den Bezeichner einer Subklasse der Klasse Exception, die ihrerseits eine Subklasse der Klasse Throwable ist.Throwable hat eine weitere Subklasse: Error. Alle Subklassen von Error betreffen sehr schwerwiegende Fehler, die grundsätzlich nicht mit einer try-Anweisung abgefangen werden sollten.