Java Abfrage
Willemers Informatik-Ecke

Abfragen

Der Befehl if leitet eine Abfrage ein. In Klammern folgt eine Bedingung. Ist diese erfüllt, wird der nächste Befehl bzw. der nächste Block von Befehlen ausgeführt. Optional kann der Befehl else verwendet werden, um einen Befehl bzw. einen Block von Befehlen auszuführen, wenn die Bedingung nicht zutrifft.

Der Syntaxgraph für den if-Befehl sieht so aus:

if ( Bedingung ) Statement;
if ( Bedingung ) Statement1; else Statement2;

Ein typisches Beispiel ist die Abfrage vor einer Division, ob der Nenner eventuell 0 ist.

if (Nenner==0)
    System.out.println(“Nenner ist gleich 0”);
else
    Ergebnis = Zaehler / Nenner;
Statt einer einzelnen Anweisung kann auch ein Block von Anweisungen verwendet werden, indem die Anweisungen in geschweiften Klammern zusammengefasst werden.
if (Nenner==0) {
    System.out.println(“Nenner ist gleich 0”);
} else {
    Ergebnis = Zaehler / Nenner;
}

Verschachtelte Abfragen

dangeling else

Wenn es bei zwei if-Anweisungen nur ein else gibt, gehört dieses immer zum inneren if. Beispiel:

if (b1)
    if (b2)
        a1;
else
    a2;

Der else-Zweig mit a2 gehört trotz der anders scheinenden Einrückung zum if mit b2.

Das Problem des Dangeling Else kann nicht auftreten, wenn man geschweifte Klammern verwendet. Damit wird die Situation eindeutig. Da auch insgesamt die Übersichtlichkeit zunimmt, sollte man Abfragen immer mit geschweiften Klammern verwenden.

Kaskadierende Abfragen

Manchmal sind zwei Abfragen notwendig. Manche Fische benötigen eine Wassertemperatur zwischen 15 und 25 Grad Celsius. Um zu prüfen, ob die Wassertemperatur in diesem Bereich liegt, werden zwei Abfragen ineinander gestellt.
if (temp > 15) {
    if (temp < 25) {
        // Dem Fisch geht es gut
    }
}
Eigentlich interessiert den Automaten nicht das Wohlbefinden der Fische, sondern, wann er eingreifen soll. Wann soll geheizt werden, wann gekühlt? Hier hilft das else.
if (temp > 15) {
    if (temp < 25) {
        // Dem Fisch geht es gut
    } else {
        // kühlen!
    }
} else {
    // heizen!
}
Komplexere Abfragen, die ein größeres Kaskadieren erforderlich machen, können auch durch komplexere Bedingungen gelöst werden. Hierzu verwenden Sie Boolesche Ausdrücke.

Abfragen verschiedener Werte

Wenn Sie hinter dem else gleich wieder ein if setzen, können Sie eine Kaskade von mehreren Abfragen bauen, die auf verschiedene Werte einer Variable abfragt:
if (muenzwert == 200) {
    // 2 Euro-Münze
} else if (muenzwert == 100) {
    // 1 Euro-Münze
} else if (muenzwert == 50) {
    // 50 Cent-Münze
} else if (muenzwert == 20) {
    // 20 Cent-Münze
} else if (muenzwert == 10) {
    // 10 Cent-Münze
} else {
    // Kleinvieh
}

Fallunterscheidung

Eine Sonderform der Abfrage ist die Fallunterscheidung. Hier wird bei abzählbaren Variablentypen der Inhalt einer Variablen mit verschiedenen Konstanten verglichen.
switch (ausdruck)
{
   case constant1:
       anweisung1;
   case constant2:
       anweisung2;
       break;
   case constant3:
       anweisung3;
       break;
   default:   
       anweisung4;
}
Der ausdruck muss vom Typ byte, short, char oder int sein. Seit Java Version 7 darf auch ein String verwendet werden. Ist der Wert von ausdruck gleich constant1, so wird die anweisung1 und die anweisung2 ausgeführt. Hinter anweisung2 sorgt das break dafür, dass die weiteren Anweisungen nicht ausgeführt werden.

Der default-Zweig wird angesprungen, wenn keine der Konstanten dem switch-Ausdruck entspricht.

Das Beispiel mit dem Münzwert würde in einer Fallunterscheidung folgendermaßen aussehen:

switch (muenzwert) {
    case 200:
        // 2 Euro-Münze
        break;
    case 100:
        // 1 Euro-Münze
        break;
    case 50:
        // 50 Cent-Münze
        break;
    case 20:
        // 20 Cent-Münze
        break;
    case 10:
        // 10 Cent-Münze
        break;
    default:
        // Kleinvieh
}
Der Syntaxgraph für die Fallunterscheidung sieht so aus:

Korrekterweise müsste der Syntaxgraph so umgebaut werden, dass nur ein default-Zweig möglich ist. Allerdings wird er dadurch auch etwas unübersichtlich.