09.09.18 7899 Views Kommentare [] 9 1

credit: ©kalafoto

Java Tutorial #5

Verzweigungen mit if else in Java

Eine zentrale Notwendigkeit der Programmierung ist, dass ein Programm in Abhängigkeit von bestimmten Bedingungen einen unterschiedlichen Ablauf nehmen kann. Man spricht hier von Verzweigungen. Schauen wir uns das nun einmal genauer an.

Falconbyte unterstüzen

Betrieb und Pflege von Falconbyte brauchen viel Zeit und Geld. Um dir auch weiterhin hochwertigen Content anbieten zu können, kannst du uns sehr gerne mit einem kleinen "Trinkgeld" unterstützen.

Thema in Kurzform

  • In der Programmierung gibt es mehrere Arten von Verzweigungsstrukturen, die wir mit den Schlüsselwörtern if und else einsetzen können.
// Beispiel für eine Verzweigung mit if else:
if (preis <= 1000) {
    System.out.println("gekauft!");
}
else{
    System.out.println("zu teuer!");
}

    Inhaltsverzeichnis

  1. if-Verzweigung
  2. if else-Verzweigung
  3. Verschachtelungen
  4. Mehrfachverzweigung mit else if
  5. Ternärer Operator
  6. Übungen

if-Verzweigung

Die einfachste Art der Verzweigung erhalten wir durch die if-Anweisung. Das Prinzip dahinter funktioniert nach der WENN-DANN-Logik:

  • Wenn (if) ein geprüfter Ausdruck wahr ist, dann (und nur dann!) führe einen bestimmten Programmblock aus.
  • Mit Ausdruck ist die zu prüfende Bedingung gemeint. Das Ergebnis dieser Prüfung ist immer entweder true oder false. Im Falle von true, wird ein entsprechender Codeblock ausgeführt. Konkret sieht das so aus:

    boolean regen = true;
    
    if (regen == true) {
        System.out.println("Nimm Regenschirm!");
    }
    

    Unmittelbar nach dem Schlüsselwort if steht in den runden Klammern der zu prüfende Ausdruck. Da dieser in unserem Fall true ist, wird der Code innerhalb der geschweiften Klammern ausgeführt (System.out.println("Nimm Regenschirm!");). Andernfalls wäre dieser Code nicht ausgeführt worden.

    Natürlich können Sie mehrere einzelne if-Prüfungen hintereinanderschreiben. Die Prüfungen erfolgen dann der Reihe nach unabhängig voneinander.

    Aktivitätsdiagramm

    Stellen Sie sich ein Computerprogramm ruhig als einen Fluss mit Anfang und Ende vor. Wie in jedem Fluss, so gibt es auch in Computerprogrammen unterschiedliche Wege, auf dem der "Programmfluss" fließen kann. Welcher Weg das ist, hängt eben vom Ergebnis der Prüfung ab, die an der Verzweigung durchgeführt wird. Der Programmfluss des Codes oben lässt sich in einem Aktivitätsdiagramm so darstellen:

    Java if else Verzweigung Aktivitätsdiagramm

    Solche Aktivitätsdiagramme helfen uns, den Ablauf eines Programms zu visualisieren und ihn besser nachvollziehen zu können. Machen Sie davon Gebrauch!

    Einsatz von Operatoren

    int preis = 3000;
    int konto = 2000;
    
    if (preis <= konto) {
        System.out.println("Gekauft!");
    }
    

    In diesem Beispiel vergleichen wir zwei numerische Werte mithilfe eines Vergleichsoperators. Die Prüfung des Ausdrucks (preis <= konto) liefert den Wert false (3000 ist nicht kleiner oder gleich 2000). Der dazugehörige Codeblock in den geschweiften Klammern wird deshalb nicht ausgeführt.

    Möchte man mehrere Bedingungen in einem Ausdruck prüfen, können wir dies mithilfe der logischen Operatoren erledigen. Ein Beispiel klärt die Lage:

    int number = 50;
    char sign = 'A';
    
    if (number == 50 && sign =='A' ) {
        System.out.println("Prüfung ergibt true!");
    }
    

    Da sowohl die Bedinung number == 50 als auch die Bedinung sign == 'A' true ergeben, ist der Ausdruck insgesamt true. Der Code innerhalb der geschweiften Klammern wird also ausgeführt.

    equals bei Strings

    Um Strings auf Gleichheit zu testen, müssen wir die Methode equals() verwenden. Der Grund hierfür ist, dass es sich bei Strings nicht um einen primitiven Datentyp, sondern um einen Objekttyp handelt und der Operator == auf Objekt-Identität testet). Sehen wir uns das einmal an:

    String nachtwache = "Jon Schnee";
    
    if (nachtwache.equals("Khal Drogo") ) {
        System.out.println(" Die Nacht zieht auf und meine Wacht beginnt.");
    }
    

    Die if-Prüfung in Zeile 3 ruft auf dem String-Objekt die Methode equals auf und übergibt ihr als Argument das String-Literal Khal Drogo. Es wird nun geprüft, ob Khal Drogo dem String aus nachtwache gleicht. Nur dann, wenn es sich um denselben String handelt, ist der Ausdruck true und es wird der Text auf der Konsole ausgegeben. In unserem Fall ist der Ausdruck aber false, und somit wird der Code nicht ausgeführt.

if/else Verzweigung

Wir haben oben gesehen, dass ein bestimmter Code-Block ausgeführt wird, wenn der zu prüfende Ausdruck in den runden Klammern true ist. Ist der Ausdruck dagegen false, geschieht nichts.

Allerdings: Wenn der zu prüfende Ausdruck false ist, dann geschieht bei einer einfachen if-Verzweigung garnichts. Oft aber brauchen wir einen alternativen Code-Block, der eben dann ausgeführt werden soll, wenn die Prüfung false ergibt.

Was wir hierzu brauchen, ist eine if/else-Konstrollstruktur. Diese lässt sich logisch so beschreiben:

  • Wenn (if) ein geprüfter Ausdruck wahr ist, dann führe einen bestimmten Programmblock aus. Ist der Ausdruck aber false, führe stattdessen (else) einen anderen bestimmten Programmblock aus.
  • Hier ein Beispiel:

    byte alter = 35;
    
    if(alter >= 18){
        System.out.println("Zutritt gewährt!");
    }
    else{
        System.out.println("Zutritt verweigert!");
    }
    

    Wie wir sehen, wird der Text "Zutritt gewährt" auf der Konsole ausgegeben, da der Wert der Variable alter mit 35 größer/ gleich 18 ist. Andernfalls würde der else-Block ausgeführt werden und "Zutritt verweigert" geprinted.

    Das Aktivitätsdiagramm mit unserer if-else-Kontrollstruktur sieht dann so aus:

    Java if else Verzweigung Aktivitätsdiagramm

Verschachtelungen

Verzweigungsstrukturen können auch ineinander verschachtelt sein. Wir greifen das Beispiel von oben (Altersprüfung) auf und bauen eine simple Verschachtelung ein:

byte alter = 35;

if(alter >= 18){
    System.out.println("Zutritt gewährt!");
    boolean vip = false;
    if(vip){
        // Spezielle Angebote
    }
    else{
        // Das normale Angebot
    }
}

else{
    System.out.println("Zutritt verweigert!");
}

Innerhalb des if-Blocks wird zunächst ein Text geprinted und eine boolesche Variable vip definiert. Danach öffnet sich eine neue Verschachtelungsstruktur, die prüft, ob die Variable vip auf true oder false. Je nach Ergebnis wird entweder der if-Block oder alternativ der else-Block ausgeführt.

Das passende Aktivitätsdiagramm sieht so aus:

Java if else verschachtelte Verzweigung Aktivitätsdiagramm

Verschachtelungen sind in der Praxis oftmals notwendig, machen das Programm aber auch schwerer zu lesen. Vermeiden Sie daher zu komplizierte Verschachtelungskonstruktionen.

Mehrfachverzweigung mit else if

Eine Verzweigung in zwei Richtungen ist schön und gut. Es gibt aber oftmals Situationen, wo das nicht genügt, weil wir mehr als zwei Alternativen brauchen.

Für solche Fälle können wir in Java mit der Mehrfachverzweigung arbeiten. Alles, was wir dazu benötigen, ist das Schlüsselwort-Paar else if. Dieses setzen wir nach dem ersten if-Block ein. Wir setzen else if mit dazugehörigen Code-Block so oft mehrfach ein, wie wir Code-Alternativen brauchen:

int akku = 48;

if(akku < 25){
    System.out.println("ROT - niedrige Akkuladung");
}
else if(akku < 50){
    System.out.println("GELB - mittlere Akkuladung");
}
else if(akku < 100){
    System.out.println("GRÜN - gute Akkuladung");
}
else{
    System.out.println("100% Akku-Ladung");
}

Es gibt nun insgesamt vier Möglichkeiten, wie der Code "fließen" kann. Genau wie beim "normalen" if am Anfang, so wird bei jedem else if ein Ausdruck in Klammern geprüft. Ergibt die Prüfung true, wird der dazugehörende Code innerhalb der geschweiften Klammern { } ausgeführt.

Da in unserem Beispiel die Variable akku den Wert von 48 speichert, ergibt die die Prüfung akku < 50 true. Somit wird der dritte Codeblock unserer Kontrollstruktur ausgeführt.

Die gesamte Kontrollstruktur wird übrigens sofort beendet, sobald eine der Prüfungen erstmals true ist. Das heißt: Wie in einer "normalen" if/else-Verzweigung gibt es auch in einer else if-Konstruktion immer nur einen Weg, den der Programmfluss gehen kann. Sobald eine Prüfung erstmals true ist, gibt es für die folgenden Codeblöcke keine Chance mehr, da es garnicht mehr zu einer weiteren Prüfung kommt.

Das "normale" else muss ganz am Ende stehen, ist aber optional.

Sehen wir uns noch das Aktivitätsdiagramm dazu an:

Java if else Mehrfachverzweigung

Ternärer Operator

Der ternäre Operator erleichtert uns die Arbeit mit einfachen Verzweigungsstrukturen. Genauer gesagt können wir den Code einer if/else-Konstruktion deutlich abkürzen.

Anstatt folgendes schreiben zu müssen...

boolean wahrheit = true;
String name = null;

if(wahrheit){
    name = "Aristoteles";
}
else{
    name = "Pinocchio";
}

... können wir die if/else-Konstruktion mit einer einzigen Code-Zeile vereinfachen:

boolean name = wahrheit ? "Aristoteles" : "Pinocchio";

Ist die Bedingung true, wird der Variablen name der Wert "Aristoteles" zugewiesen, ansonsten "Pinochhio".

Ternär bedeutet aus drei Grundeinheiten bestehend und so verfügt der ternäre Operator ? : drei Operanden: Die Bedingung, den Anweisungsblock 1 (falls Bedingung true) und den Anweisungsblock 2 (falls Bedingung false). Die allgemeine Syntax sieht so aus:

Java ternärer Operator

Ist die Bedingung true, wird der Code zwischen ? und : ausgeführt. Ist sie dagegen false, wird der Code nach dem : ausgeführt.

Einfache Verzweigungen mit dem ternären Operator zu lösen, spart im Alltag viel nervige Schreibarbeit. Auch wenn es am Anfang etwas gewöhnungsbedürftig ist.

Übungen

einfach

Was ist die Ausgabe des folgenden Programms?

public static void main(String[] arg) {

       int zahl = 100;

       if(zahl > 30){
           System.out.println("A");
       }
       else if(zahl > 50){
           System.out.println("B");
       }
       else if(zahl > 100){
            System.out.println("C");
       }
    }

A. A
B. B
C. C
D. Compiler-Fehler, da der else-Block fehlt.

Lösung ein-/ausblenden

mittel

Welchen Wert hat die Variable z am Ende des Code Snippets?

int x = 1;
int y = 1;

int z = y<10 ? y++ : ++x;
Lösung ein-/ausblenden

schwer

Schreiben Sie einen kleinen Rabattrechner. Erstellen Sie hierzu eine Klasse namens Rabattrechner mit einer Main-Methode. Darin deklarieren Sie drei Variablen: Eine boolesche Variable stammkunde, eine String Variable für den Namen des Kunden (name) sowie eine numerische Variable namens einkaufswert. Die Variablen initialisieren Sie mit sinnvollen Werten.

Nun zur Sache: Sofern der Kunde ein Stammkunde ist und Jon Schnee heißt, soll er einen Rabatt erhalten. Die Höhe des Rabatts richtet sich nach dem Einkaufswert: 2% bei einem Einkaufswert von mindestens 1500€, 5% bei einem Einkaufswert von mind. 2000€ und 10%, wenn der Einkaufswert mindestens bei 3000€ liegt.

Geben Sie am Ende den ursprünglichen Einkaufswert sowie den neuen (gegebenenfalls rabattierten) Einkaufswert auf der Konsole aus.

Lösung ein-/ausblenden

Konstruktoren bei Vererbung

Trainieren Sie ihre Konstruktoren-Skills

Pass-by-value in Java

wie genau der Vorgang der Parameterübergabe bei Methoden abläuft, klären wir hier.

Java einrichten

Erfahren Sie, wie einfach es ist, mit Java zu beginnen

FALCONBYTE.NET

Handmade with 🖤️

© 2018-2022 Stefan E. Heller

Impressum | Datenschutz | Changelog

Falconbyte GitHub facebook programmieren lernen twitter programmieren lernen discord programmieren lernen