Grundlegendende Programmierkonzepte in Java
While
Die nächste Erweiterung unseres Programms soll nun
sein, dass Anweisungen mehrfach ausgeführt werden. Natürlich könnten wir
dafür viele Male das selbe schreiben. Es geht aber auch sehr viel
einfacher. Mit Hilfe der while-Schleife können wir
bestimmen, dass ein Teil unseres Programms wiederholt wird. Der Aufbau
von While ist sehr ähnlich zu dem des If:
while( Wahrheitsaussage ) { Anweisung; }
Wenn Java im Programmablauf eine While erreicht, prüft es als
Erstes, ob die Wahrheitsausage wahr ist. Wenn nicht werden die
Anweisungen übersprungen. Sollte die Aussage wahr sein, so wird der
Anweisungsblock ausgeführt. Ist das Ende erreicht, so springt Java
wieder an den Anfang der While-Schleife und beginnt von Neuem.
Was
würde jetzt aber passieren, wenn der Wahrheitsausdruck immer wahr wäre?
Java würde in diesem Fall für immer vom Ende der Schleife wieder zum
Anfang springen. Wir hätten eine Endlosschleife. Das Programm läuft dann
also bis es vom Betriebssystem beendet wird. Hierfür haben wir in
Eclipse ein Button in Form eines roten Quadrats.
Wir
wollen nun unser Programm so erweitern, dass der Benutzer mehrere Zeilen
Text eingeben kann und wir diesen in einer Variable speichern. Durch
Eingabe des Wortes “quit” soll das Programm den Ganzen Text ausgeben und
sich dann beenden.
Bevor wir das umsetzen können,
müssen wir aber noch klären, wie wir eine Aussage verneinen. Hierfür hat
Java das Ausrufungszeichen reserviert. Wir können also schreiben
while( ! text.equals("quit")) {}
um auszudrücken, dass nur die Eingabe “quit” zu einem Abbruch führen soll.
import java.util.Scanner; public class Tagebuch { public static void main(String[] args) { System.out.println("Wie heißt du?"); Scanner scanner = new Scanner(System.in); String name = scanner.next(); if(name.equals("Jan")) { System.out.println("Hallo " + name + "!"); String text = ""; String eingabe = scanner.next(); while( ! eingabe.equals("quit") ) { text = text + eingabe; eingabe = scanner.next(); } System.out.println("Eingegeben wurde: " + text); } else { System.out.println("Der Benutzer ist abgelehnt."); } scanner.close(); } }
Es ich wichtig, dass wir als letzte Anweisung im Block der
While-Schleife wieder eine Zeile Text einlesen. Würden wir dies
vergessen, so hätten wir eine Endlosschleife.
Durch
die Anweisung text = text + eingabe; wird die Eingabe an den
zwischengespeicherten Text hinten angehängt. Dies funktionier, weil Java
erst den rechten Teil also text + eingabe ausführt und erst danach das
Ergebnis in die Variable text speichert. Es kommt sehr oft vor, dass man
an eine Variable etwas anhängen möchte. Aus diesem Grund hat Java
hierfür eine Kurzschreibweise
text += eingabe;
Wir wollen uns noch eine andere Schreibweise anschauen, die genau das
selbe ergebnis bring. Hierfür bauen wir die Schleife so um, dass sie
immer wieder von vorne beginnt while(true){...}. Jetzt können wir in der
Schleife den Text einlesen und sollte die Eingabe “quit” sein, so
verlassen wir die Schleife mit dem Schlüsselwort break. Das geänderte Beispiel ist dann:
Scanner scanner = new Scanner(System.in); String text = ""; while (true) { String eingabe = scanner.next(); if(eingabe.equals("quit")) { break; } text += eingabe + "\n"; }
Wir sollten an dieser Stelle noch auf eine mögliche Fehlerquelle.
Im vorherigen Beispiel wurde die Variable “text” vor der Schleife
deklariert. Das ist sehr wichtig, dann Variablen in Java existieren nur
in dem Block in dem sie deklariert wurden und in Blöcken, die mit in
ihrem eingebettet sind. Aus diesem Grund kann die Variable “text” auch
in der Schleife verwendet werden. Wir sprechen hierbei vom Scope der Variable.
Die
Variable “eingabe” existiert nur in dem Block der Schleife. Sie wir bei
jedem Schleifendurchlauf neu deklariert und kann außerhalb des
Schleifen-Blocks nicht verwendet werden.
Bei dem
Einlesen einer Zeile mit scanner.next() wird das Zeilenende-Zeichen
entfernt. Aus diesem Grund wird in dem Beispiel wieder ein Zeilenumbruch
("\n") angehängt. Zeilenumbrüche werden von Computern als normale
Zeichen behandelt. Es gibt aber keine Taste und keine richtige
Darstellung für diese Zeichen, darum werden sie im Quellcode durch zwei
Zeichen dargestellt.
Mitlerweile ist der Quelltext
schon etwas angewachsen und wir sollten uns langsam Gedanken über die
Lesbarkeit machen. Einen Punkt der Lesbarkeit, die Einrückung, hatten
wir bereits besprochen. Dieser Punkt ist so wichtig, dass Eclipse
hierfür einen Automatismus bereitstellt. Durch die Tastenkombination
Strg + Umschalt + F wird der Code automatisch formatiert. Die Einrückung
ist wieder gerettet.
Einweiterer Aspekt der Lesbarkeit sind Kommentare.
Kommentare sind Anmerkungen für den Programmier. Sie ändern das
Verhalten des Programms nicht sondern werden vom Compiler ignoriert. Mit
den Zeichen // wird alles, was bis Zum Ende einer Zeile folgt zu einem
Kommentar. Alternativ können auch Blockkommentare /* Mehrere Zeilen Text
*/ geschrieben werden. Wie viel man kommentiert ist jedem selbst
überlassen. Es empfiehlt sich aber, regelmäßig zu notieren warum man
etwas gemacht hat. Was genau an einer Stelle geschieht, braucht man
selten kommentieren, da dies ja durch den Quelltext dokumentiert ist.
Unser Beispiel könnte mit Kommentaren wie folgt ergänzt werden:
import java.util.Scanner; public class Tagebuch { public static void main(String[] args) { System.out.println("Wie heißt du?"); Scanner scanner = new Scanner(System.in); String name = scanner.next(); if (name.equals("Jan")) { System.out.println("Hallo " + name + "!"); System.out.println("Bitte Text eingeben. Zum Beenden 'quit' eingeben."); // Schleife zum Einlesen des Textes String text = ""; while (true) { String eingabe = scanner.next(); // "quit" soll das Ende der Eingabe signalisieren if (eingabe.equals("quit")) { break; } text += eingabe + "\n"; } System.out.println("Eingegeben wurde: " + text); } else { System.out.println("Der Benutzer ist abgelehnt."); } scanner.close(); } }