Die Ablaufsteuerung von Programmen wird durch Control Statements gesteuert. Diese Anweisungen verkörpern das Paradigma der strukturierten Programmierung, welches erstmals in der Programmiersprache ALGOL (ALGOrithmicLanguage) verwirklicht wurde. Soviel zur Historie.
Ein Block von Statements wird solange
abgearbeitet und ggf. wiederholt, bis die while condition den Wert
false liefert. Ist die Bedingung bereits vor Eintritt in den Block
erfüllt, wird der Block nie betreten. Im hiesigen Sprachgebrauch
hat sich auch der Begriff "abweisende Schleife" etabliert.
Generelle Form:
while (expression) { statement(s); } |
Beispiel: Die Werte von 10 bis 0 sollen tabellarisch ausgegeben werden.
int val = 10; while (val > -1) { System.out.println( val--); } |
Ähnlich des while Statements
verhält sich diese Schleifenkonstruktion. Hier wird ein Block
solange abgearbeitet, bis eine Abbruchbedingung ist. Es bestehen zwei
wesentliche Unterschiede: Die Schleife wird unter allen Umständen
betreten. Die Schleife wird verlassen wenn die while condition den
Wert true liefert.
Generelle Form:
do { |
Beispiel: Die Werte von 10 bis 0 sollen tabellarisch ausgegeben werden.
int val = 10; do { Sytem.out.println( val--); } while (val < 0); |
Schleifen, deren Bearbeitungsgrenzen
feststehen, können auch als for-Schleifen (im Sinne von ... bis
...) gestaltet werden. Diese Form stellt eine Alternative zum while
Statement dar, bietet aber außerdem die Kapselung der
Initialisierungswerte und ggf. der Inkremetierungswerte an.
Generelle Form:
for (init; terminate; increment) { statement(s); } |
Beispiel: Die Werte von 10 bis 0 sollen
tabellarisch ausgegeben werden.
for (int i = 10; i >= 0;i--) { System.out.println( i); } |
Auffällig ist auch noch die gekapselte Deklaration des laufenden Index. Die im Beispiel verwendete Variable i existiert nach der Abarbeitung der Schleife praktisch nicht mehr. Genauer gesagt: Der Index ist nicht mehr erreichbar, denn es handelt sich um eine lokale Variable innerhalb des for Statements.
Die einfachste Form der Ablaufsteuerung
ist das if Statement. Wenn eine Bedingung erfüllt ist, dann ...
Generelle Form:
if (expression) { statement(s); } |
Beispiel: Wenn ein String mit großen Buchstaben beginnt soll er ausgeben werden.
if (str.charAt(0).isUpperCase()){ System.out.println( str); } |
Nun noch ein Blick auf den alternativen
Zusatz "else":
Generelle Form:
if(expression) { statement(s); } else { statement(s); } |
Beispiel: Wenn ein String mit großen Buchstaben beginnt soll er ausgeben werden, andernfalls soll "zu klein." erscheinen.
if (str.charAt(0).isUpperCase()) { System.out.println( str); } else { System.out.println( "zu klein."); } |
Eine besondere Form des if Statements
stellt das Swatch Statement dar. Unterschiedliche Werte ein und
desselben Ausdrucks werden differenziert.
Generelle Form:
Swatch (Expression) { Case constants: statement(s); break; Case constants: statement(s); break; ... default: statement(s); } |
Beispiel: Die Wochentage sollen
entsprechend ihrer Nummerierung (1=Montag, ... 7=Sonntag) ausgegeben
werden.
String str; ... switch (daynum) { case 1: str = "Montag"; break; case 2: str = "Dienstag"; break; case 3: str = "Mittwoch"; break; case 4: str = "Donnerstag"; break; case 5: str = "Freitag"; break; case 6: str = "Samstag"; break; case 7: str = "Sonntag"; break; default: str = "under construction"; } System.out.println( str); |
Dieses Statement bewirkt das Verlassen
eines Blocks. Sinnvoll wird es in Schleifen eingesetzt, um diese auf
gewaltsame Weise zu verlassen. Unabdingbar ist dieses Statement auch
bei der Anwendung des switch Statements, wie eben gezeigt.
Beispiel:
Die Zeichen eines Strings unbekannter Länge sollen solange
ausgegeben werden, bis ein Leerzeichen erkannt wird:
for(int i=0;;) { char ch = str.charAt(i++); if (ch != ' ') System.out.print( ch); else break; } |
Es besteht auch die Möglichkeit, das break Statement mit einem Ziel zu versehen. Der folgende Abschnitt zeigt diese Möglichkeit genauer.
Ein Label oder ein Sprungziel ist zwar
ein Anachronismus in modernen Programmiersprachen, trotzdem hält
er sich tapfer. Hier soll nur kurz auf diese Möglichkeit
eingegangen werden.
Beispiel: Wenn ein String das Zeichen '@'
enthält, soll "at ", gefolgt vom Reststring ausgegeben
werden.
int idx = 0; while (i < str.length()) { if (str.charAt(i++) == '@') break mail; } ... mail: System.out.println( "at " + str.substring(i)); |
Mit dieser Anweisung wird das
Überspringen von Blockabschnitten ermöglicht. Dieses
Statement mag eine Alternative zu Statements der Form if...else sein.
Beispiel: In einem String sollen alle Leerzeichen durch '_'
(underlines) ersetzt werden. Die Anzahl der ersetzten Zeichen soll
ebenfalls ermittelt werden.
int numSpace = 0; for (int i=0; i < str.length(); i++) { if (str.charAt(i) != ' ') continue; numspace++; str.setCharAt( i, '_'); } |
Dieses Statement erweist sich als
ungemein praktisch um Methoden schnell und definiert zu verlassen.
Damit kann jede Methode mit beliebig vielen Ausgängen versehen
werden.
Beispiel: Ein String soll nach einer bestimmten
Zeichenfolge durchsucht werden; das Ergebnis ist true oder false.
public boolean isInside( String str, String src) { return (str.indexOf( src) != 0); } |
Java erlaubt unter bestimmten Voraussetzungen die Anwendung der Versuch-und-Irrtum-Prinzips. So kann der Quelltext durchaus korrekt sein, aber bei der Ausführung des übersetzten Codes treten unerwartete Bedingungen auf. So könnte beispielsweise eine Internetverbindung während einer Übertragung unterbrochen werden, eine Datei während der Bearbeitung vom Systemadministrator umbenannt werden oder einfach nur eine Division durch Null stattfinden. Auf die Verwendung dieser Statements wird noch detailliert eingegangen, trotzdem sei hier bereits die generelle Form skizziert.
try { statement(s); } catch (exceptiontype name) { statement(s); } catch (exceptiontype name) { statement(s); } finally { statement(s); } |