02.06 IF-Bedingungen
Über IF-Bedingungen (auch IF-Verzweigungen oder IF-Anweisungen, keinesfalls aber IF-Schleifen genannt) wird ein großer Teil der Logik in Programmen definiert. Mit ihnen ist es möglich auf einen aktuellen Zustand zu reagieren und dann entsprechende Aktionen auszuführen. Die Syntax ist dabei denkbar einfach:
if (1 == 1) { System.out.println("1 ist 1"); }
Ein klein geschriebenes if
, gefolgt von einer öffnenden, runden Klammer und einem booleschen Wert bzw. einem Ausdruck, der einen solchen zurück gibt. Abgeschlossen wird diese Anweisung dann mit einer geschlossenen, runden Klammer. Danach beginnt der Gültigkeitsbereich der IF-Verzweigung wie gewohnt mit einer offenen, geschweiften Klammer und endet mit einer geschlossenen, geschweiften Klammer. Alle Anweisungen, die sich in diesem Block befinden werden ausgeführt, sobald der boolesche Wert in den Klammern wahr, also true
ist. Soll nur eine Anweisung in der IF-Bedingung ausgeführt werden, können die geschweiften Klammern auch weggelassen werden. Man sollte sie jedoch – um die gute Lesbarkeit des Codes zu gewährleisten – dennoch setzen.
if (1 == 1) System.out.println("1 ist 1");
Wie Sie in den letzten Kapiteln gelernt haben, ist ein einfaches Gleichheitszeichen (=
) eine Zuweisung und ein doppeltes (==
) eine Überprüfung. Deshalb muss in unserer Abfrage auch ein doppeltes Gleichheitszeichen verwendet werden. Die Verwendung eines einzelnen Gleichheitszeichen, sprich einer Zuweisung, kann zu ungewollten Fehlern führen.
boolean bool = false; if (bool = true) { System.out.println("Wahr"); }
Dieser Ausschnitt würde in der If-Anweisung (nicht im Block der If-Bedingung) der Variablen bool
den Wert true
zuweisen und anschließend den Wert dieser Variablen überprüfen und somit immer den If-Block ausführen. Um solche Fehler zu vermeiden, kann man die Reihenfolge der Argumente umkehren:
boolean bool = false; if (true == bool) { System.out.println("Wahr"); }
Wird hier nur ein einzelnes Gleichheitszeichen verwendet, wird ein Compiler-Fehler ausgelöst. Um solche Fehler von vornherein zu vermeiden, können Sie bei boolschen Werten auch ganz auf ein zweites Argument verzichten.
boolean bool = false; if (bool) { System.out.println("Wahr"); } if (!bool) { System.out.println("Falsch"); }
Es ist auch möglich mehrere IF-Anweisungen aneinander zu Ketten. Dazu gibt es die Statements else if
und else
. else if
enthält ebenfalls eine Bedingung. Diese ist aber nicht allein für die Entscheidung verantwortlich, ob dieser Block ausgeführt wird oder nicht. Zuerst überprüft else if
ob ein vorhergehendes if
bzw. else if
in dieser Kette bereits ausgeführt wurde. Trifft dies zu, wird der Code in diesem Block nicht ausgeführt. Auch nicht, wenn die Bedingung der Else-If-Verzweigung der Wahrheit entspricht. Der Else-Block wird immer am Ende einer solchen Kette aufgeführt. Dieser Block wird auch nur dann ausgeführt, wenn alle vorhergehenden Statements nicht der Wahrheit entsprechen. Anhand dieses Beispiels wird dieser Vorgang verdeutlicht.
package sprachsyntax.de.main; public class IFTest1 { public static void main(String[] args) { int zahl1 = 4; int zahl2 = 2; if (zahl1 == zahl2) { System.out.println(zahl1 + " ist " + zahl2); } else if (zahl1 > zahl2) { System.out.println(zahl1 + " ist groesser als " + zahl2); } else { System.out.println(zahl1 + " ist kleiner als " + zahl2); } } }
Natürlich lässt sich dieses Ergebnis auch ohne eine Verkettung von If-Anweisungen erreichen. Aber es gibt auch Anwendungsfälle, bei denen sich dieses Vorhaben als deutlich komplizierter darstellt. Stellen Sie sich einmal vor, Sie möchten anhand einer gegebenen Anzahl an Punkten, eine Note berechnen is viagra a prescription drug in australia. Wenn der Schüler über 91 Punkte erreicht hat, bekommt er die 1, über 82 ist die 2, über 70 die 3, über 50 die 4, über 35 die 5 und ansonsten gibt’s die 6. Eine gedankenlos programmierte Abfrage könnte zum Beispiel so aussehen:
package sprachsyntax.de.main; public class IFTest2 { public static void main(String[] args) { int punkte = 85; int note = 0; if (punkte > 91) { note = 1; } if (punkte > 82) { note = 2; } if (punkte > 70) { note = 3; } if (punkte > 50) { note = 4; } if (punkte > 35) { note = 5; } if (punkte > 0) { note = 6; } System.out.println("Erreichte Note: " + note); } }
Auf den ersten Blick schaut diese Klasse noch fehlerfrei aus. Anhand der Punkte erwartet man als erreichte Note eine 2. Dies trifft aber nicht zu. Jede Punktzahl würde bei dieser Aneinanderreihung von IF-Bedingungen eine 6 ergeben. Die Ursache des Problems ist schnell gefunden. Es steht zwischenzeitlich zwar die richtige Note in der Variablen, aber diese wird sofort wieder überschrieben, da 82 genauso wie 70, 50, 35 und letztendlich auch 0 kleiner als die erreichten 85 Punkte sind. Eine mögliche Lösung hierfür wäre eine umgekehrte Abfrage der Noten, also zuerst auf die 6 überprüfen, dann auf die 5, gefolgt von der 4, usw. usf.. Aber warum so kompliziert, wenn es auch deutlich leichter und ohne großes Kopfzerbrechen funktioniert?
package sprachsyntax.de.main; public class IFTest2 { public static void main(String[] args) { int punkte = 85; int note = 0; if (punkte > 91) { note = 1; } else if (punkte > 82) { note = 2; } else if (punkte > 70) { note = 3; } else if (punkte > 50) { note = 4; } else if (punkte > 35) { note = 5; } else { note = 6; } System.out.println("Erreichte Note: " + note); } }
If-Anweisungen können auch ohne Probleme ineinander verschachtelt werden um komplexere Abfragen zu realisieren.
int zahl1 = 10; if (zahl1 <= 20) { if (zahl1 >= 10) { System.out.println("Zahl liegt zwischen 20 und 10"); } else { System.out.println("Zahl ist kleiner als 10"); } } else { System.out.println("Zahl ist groesser als 20"); }
Manchmal ist es aber auch nötig, zwei Dinge in einer Bedingung zu erfassen. Auch das ist möglich. Dazu haben Sie in den letzten Kapiteln die logischen und binären Operatoren &&
, ||
, ^
, &
und |
kennengelernt. Der Unterschied zwischen logischen und binären Operatoren besteht darin, dass ein &&
sofort false
zurückliefert und das zweite Argument gar nicht erst überprüft, sobald das erste Argument falsch ist. Ein ||
hingegen liefert sofort true
zurück ohne das zweite Argument zu betrachten, falls das Erste wahr ist.
int zahl1 = 1; int zahl2 = 2; int zahl3 = 3; int zahl4 = 1; if (zahl1 == zahl4 || zahl2 == zahl3) { if (zahl1 == zahl4 ^ zahl2 == zahl3) { System.out.println("Nur eine Bedingung ist wahr"); } else if (zahl1 == zahl4 && zahl2 == zahl3) { System.out.println("Beide Bedingungen sind wahr"); } } else { System.out.println("Keine Bedingung ist wahr"); }
Es gibt ebenfalls die Möglichkeit einer verkürzten IF-Verzweigung. Diese gibt dann direkt einen Wert zurück. Dabei ist der Aufbau wie folgt. Bedingung ? Wert falls Bedingung wahr ist : Wert falls Bedingung nicht wahr ist
.
int alter = 17;
System.out.println(„Du bist “ + (alter < 18 ? "minderjaehrig" :
"volljaehrig"));[/sourcecode]
Auch diese verkürzten Anweisungen können ineinander verschachtelt werden:
[sourcecode language="java"]int alter = 17;
System.out.println("Du bist " +
(alter < 18 ?
(alter < 14 ? "ein Kind" : "jugendlich") :
"volljaehrig"));[/sourcecode]
Diese verkürzte Schreibweise wird auch ternärer Operator genannt.
Übung
Quote: „Finden Sie den Fehler auf der nächsten Seite.“
Auf der nächsten Seite wird darauf nicht mehr eingegangen, denn dort wird nur Switch-Case behandelt. Den Fehler solltet ihr daher hier schon aufklären.
Hallo WarrenFaith,
da haben wir ja einen richtig eifrigen und mitdenkenden Leser gewonnen 🙂 .
Auf der nächsten Seite wird doch darauf hingewiesen, wie der Fehler zu Stande kommt!? Ich glaube hier liegt ein Verständnisproblem vor. Die nächste Seite ist nicht das nächste Kapitel, sondern wirklich die nächste Seite, auf die (falls vorhanden) direkt unter den Bookmarks hingewiesen wird.
Da ich aus den zwei Seiten jetzt eine einzige gemacht habe, ist das hier aber nicht mehr zu beobachten. Ein anderes Beispiel für die zweite Seite kann sich im Kapitel 03.07 Reguläre Ausdrücke angesehen werden.
Gruß
Stefan
Ah, da gibts auch noch Seiten… ganz ehrlich, ich hab diese Angabe der Seitenauswahl komplett übersehen! Vielleicht kann man das irgendwie etwas prominenter anzeigen lassen?! Also über den Bookmarklinks und vielleicht rechts statt links, damit man bei dem fast schon gewohnten Klick aufs nächste Kapitel doch noch die Seiten findet 🙂
Ist notiert, ich werde mich darum kümmern.
[update] Bookmark-Leiste befindet sich jetzt unterhalb der Seitennavigation.