Java-Grundlagen: Verzweigungen – Die if-else-Anweisung und die switch-Anweisung

In Java werden Verzweigungs-Anweisungen für das Ansteuern bestimmter Programmbereiche verwendet. Dazu werden vor Laufzeitbeginn Bedingungen festgelegt, unter denen bestimmte Programmbereiche ausgeführt werden oder auch nicht.

Zur Laufzeit wird dann an diesen Verzweigungen überprüft, ob die jeweilige Bedingung erfüllt ist oder nicht. Ist die Bedingung erfüllt, wird der verzweigte Programmbereich ausgeführt. Falls nicht, wird der Programmbereich übersprungen, also ausgelassen.

In der Programmiersprache Java sind die einfachen if-Anweisung, die if-else-Anweisung und die switch-Anweisung für Mehrfachverzweigungen implementiert.

plhq_teaser_hbox_gelb_fotolia_RA Studio_46292813

Unser großes
Android Online-Kurs
Gesamtpaket



Weitere Infos

Die einfache if-Anweisung und die if-else-Anweisung

Bei der einfachen if-Anweisung wird zunächst ein Ausdruck ausgewertet und überprüft, ob dieser wahr ist (true). Ist der Ausdruck wahr, wird die nachfolgende Anweisung ausgeführt.

Sollen mehrere Anweisungen ausgeführt werden, müssen diese innerhalb eines Blocks gestellt werden.

if (Ausdruck)
  AnweisungIfZweig;


if (Ausdruck)
{
  AnweisungIfZweig1;
  AnweisungIfZweig2;
}

Ist der Ausdruck nicht wahr, wird die if-Anweisung übersprungen und die nächst folgende Anweisung ausgeführt. Wird ein if-Block verwendet, wird der ganze Block übersprungen.

Bei der if-else-Anweisung wird dem if-Zweig noch ein else-Zweig hinzugefügt. Somit wird immer einer der beiden Zweige ausgeführt. Ist die Bedingung erfüllt, wird der if-Zweig ausgeführt, andernfalls der else-Zweig.

Auch bei der if-else-Anweisung können Block-Anweisungen verwendet werden, um eine Folge von Anweisungen auszuführen.

if (Ausdruck)
  AnweisungIfZweig;
else
  AnweisungElseZweig;


if (Ausdruck)
{
  AnweisungIfZweig1;
  AnweisungIfZweig2;
}
else
{
  AnweisungElseZweig1;
  AnweisungElseZweig2;
}

Hinweis 1: Der Ausdruck, der zu Beginn der if-Anweisungen und if-else-Anweisung überprüft wird, muss immer vom boolean-Datentyp sein. Numerische Datentypen oder Objekt-Datentypen sind an dieser Stelle in Java nicht erlaubt.

Hinweis 2: Die Verschachtelung von if-Anweisungen mit if-else-Anweisungen ohne das Trennen der Anweisungen durch Block-Klammern führt zu einer Mehrdeutigkeit, dem sogenannten „dangling else„. Diese Mehrdeutigkeit wird aufgelöst, indem der else-Zweig immer der innersten if-Anweisung zugeordnet wird. Mehr dazu im Quelltext-Beispiel.

In dem folgenden Beispielprogramm werden die beiden Java-Verzweigungen einfache if-Anweisung und if-else-Anweisung verwendet. Im unteren Drittel des Quelltextes wird auf das Problem der Mehrdeutigkeit durch das „dangling else“ hingewiesen.

Beispiel if- und if-else-Anweisungen in Java.

/*
* Beispielanwendung if- und if-else-Anweisungen in Java.
*/

public class Verzweigungen{
 public static void main(String[] args) {

   int a = 5, b = 16;
   boolean bedingung;

   bedingung = a < b;

   if (bedingung) 
      System.out.println("\nDie Bedingung ist wahr: " + bedingung);

   
   if (a > b)
   {
      System.out.println("\na ist groesser als b");
      System.out.println("a = " + a + "     b = " + b);
   }
   else
   {
      System.out.println("\na ist nicht groesser als b");
      System.out.println("a = " + a + "\nb = " + b);
   }

   

   // Dangling else falsch eingerueckt
   if (a > b)
      if (a == 20)
          System.out.println("\nIn der innersten if-Anweisung.");
   else 
      System.out.println("\nIn der innersten else-Anweisung.");

   // Dangling else richtig eingerueckt
   if (a > b)
      if (a == 20)
          System.out.println("\nIn der innersten if-Anweisung.");
      else 
          System.out.println("\nIn der innersten else-Anweisung.");

   // Mehrdeutigkeit durch Klammerung beseitigt
   if (a > b)
   {
      if (a == 20)
      {
          System.out.println("\nIn der innersten if-Anweisung.");
      }
   }
   else
   { 
      System.out.println("\nIn der ausseren else-Anweisung.");
   }

 }
 
}

In Zeile 13 wird die Bedingung der if-Anweisung geprüft. Da die boolean-Variable den Wert true enthält, ist die Bedingung erfüllt und die nachfolgende Anweisung wird ausgeführt.

In Zeile 17 wird die Bedingung der if-else-Anweisung geprüft, dazu wird der Ausdruck a > b ausgewertet. Da der Ausdruck nicht wahr ist, wird der if-Zweig nicht ausgeführt und stattdessen direkt in den else-Zweig gesprungen. Die beiden, sich darin befindenden, Anweisungen werden der Reihe nach ausgeführt.

In den Zeilen 30 bis 55 wird das Problem der Mehrdeutigkeit vorgestellt. Durch korrekte Klammerung kann man das „dangling else“ eleminieren und eine bessere Lesbarkeit des Quelltextes erreichen.

Die zur Beispielanwendung gehörende Textausgabe ist in der unten abgebildeten Kommandozeilenausgabe dargestellt.

Java Verzweigungen if-else-Anweisung

Java Verzweigungen – Ausgabe der Beispielanwendung

Die switch-Anweisung – Mehrfachverzweigungen in Java

Möchte man in einem Java-Programm an einer Stelle auf mehr als zwei Programmbereiche verzweigen, so benutzt man am besten die switch-Anweisung. Durch sie ist es möglich, abhängig von einer Bedingung, zum mehreren Codezweigen zu springen.

Mit der switch-Anweisung können also Mehrfachverzweigungen einfach und effektiv realisiert werden. Das unterscheidet sie von der if-else-Anweisung, bei der nur eine Zweifach-verzweigung möglich ist.

switch (Ausdruck)
{
  case Konstante1:
     Anweisung1Fall1;
     Anweisung2Fall1;
     break;
  case Konstante2:
     Anweisung1Fall2;
     Anweisung2Fall2;
     break;
  ...
  default:
     Anweisung1Default;
     Anweisung2Default;
}

Der Ausdruck in runden Klammern nach dem switch-Schlüsselwort gibt an, zu welcher Sprungmarke verzweigt werden soll.

Dazu muss der Ausdruck zunächst einmal ausgewertet werden, anschließend wird genau zu der Sprungmarke (case) gesprungen, deren Konstante dem Ergebnis des Ausdrucks entspricht.

Der Ausdruck kann vom Datentyp byte, short, int oder char sein. Es ist auch möglich den Aufzählungsdatentyp enum zu verwenden.

Seit Java Version 7 dürfen bei switch-Anweisungen auch Ausdrücke vom String-Datentyp verwendet werden.

Ist keine passende Sprungmarke vorhanden, wird die default-Sprungmarke angesprungen. Sofern diese angegeben ist, da sie nicht zwingend erforderlich ist. Falls die default-Sprungmarke fehlt und keine passende Sprungmarke vorhanden ist, wird keine Anweisung innerhalb der switch-Anweisung ausgeführt.

Regeln für das Verwenden der switch-Anweisung

  • Jede Sprungmarke muss eine andere Konstante enthalten.
  • Die default-Sprungmarke ist optional und darf nur einmal angegeben werden.
  • Wird eine Sprungmarke angesprungen, werden anschließend alle nachfolgenden Anweisungen ausgeführt. Es erfolgt keine Unterbrechung, wenn die nächste Sprungmarke erreicht wird. Eine Unterbrechung muss durch das Verwenden einer break-Anweisung erzwungen werden.
  • Jede break-Anweisung innerhalb einer switch-Anweisung führt zu einem Sprung aus der switch-Anweisung und zum Beenden dieser.

In der folgenden Java-Anwendung wird die switch-Anweisung als Mehrfachverzweigung genutzt. Es wird abhängig vom vorgegebenen Wochentag eine dazu passende Zeichenkette ausgegeben, welche Zeichenkette das ist, wird über die switch-Anweisung festgelegt.

Beispiel switch-Anweisung in Java.

/*
* Beispielanwendung switch-Anweisungen in Java.
*/

public class Verzweigungen{
 public static void main(String[] args) {

   String wochentag, tagInfo;

   wochentag = "Samstag";

   switch (wochentag.toLowerCase())
   {
      case "montag":
         tagInfo = "Heute ist der erste Arbeitstag.";
         break;
      case "dienstag":
         tagInfo = "Heute ist der zweite Arbeitstag.";
         break;
      case "mittwoch":
         tagInfo = "Heute ist der dritte Arbeitstag.";
         break;
      case "donnerstag":
         tagInfo = "Heute ist der vierte Arbeitstag.";
         break;
      case "freitag":
         tagInfo = "Heute ist der letzte Arbeitstag.";
         break;
      case "samstag":
      case "sonntag":
         tagInfo = "Heute ist kein Arbeitstag.";
         break;
      default:
         tagInfo = "Der Wochentag wurde nicht erkannt.";
   }

   System.out.println("\nEs ist " + wochentag + ". " + tagInfo);

 }
 
}

Der Ausdruck innerhalb der runden Klammern nach dem switch-Schlüsselwort in Zeile 12 ergibt einen String, der nur aus Kleinbuchstaben besteht. Dieser wird anschließend mit den String-Konstanten der 7 Sprungmarken verglichen.

Liegt eine Übereinstimmung vor, wird zu der passenden Sprungmarke gesprungen. In der Beispielanwendung ist das die sechste Sprungmarke mit der Konstante „samstag“ in Zeile 29.

plhq_teaser_hbox_gelb_fotolia_RA Studio_46292813

Unser großes
Android Online-Kurs
Gesamtpaket



Weitere Infos

Für diese Sprungmarke ist keine Anweisung angegeben, auch keine break-Anweisung. Daher wird zu der nachfolgenden Sprungmarke „sonntag“ übergegangen. Für sie sind zwei Anweisungen angegeben.

Die Erste weißt eine Zeichenkette der String-Variable tagInfo zu. Die Zweite ist eine break-Anweisung und führt zum sofortigen Beenden der switch-Anweisung.

In Zeile 37 wird der vorgegebene Wochentag und eine kurze Info auf der Kommandozeile ausgegeben. Siehe dazu folgende Abbildung:

Java Verzweigungen switch-Anweisung

Java Verzweigungen switch-Anweisung – Ausgabe der Beispielanwendung


Comments 4

  1. Oben steht „Mit der switch-Anweisung können also Mehrfachverzweigungen einfach und effektiv realisiert werden. Das unterscheidet sie von der if-else-Anweisung, bei der nur eine Zweifach-verzweigung möglich ist.“ Mit der If-else-Anweisung sind doch aber auch Verzweigungen von mehr als Zwei möglich.
    Was dann so aussähe:

    If(Bedingung){
       //..
    } else if(Bedingung){
       //...
    } blabla bis (){
       //...
    }else {
       //...
    }
    
    1. Post
      Author

      Hallo Ronny,

      ja mit if-else-if-Anweisungen können Mehrfachverzweigungen realisiert werden. Für manche Programmierer ist diese Art von Verzweigung aber schwieriger nachzuvollziehen. Bei der switch-Anweisung ist meist klarer, was der Quellcode genau bezweckt.

      Viele Grüße, Chris

  2. Pingback: Enumerations in Java- Aufzählungstypen definieren und erweitern

  3. Pingback: Verzweigungen in Java: Die if-else-Anweisung, switch-Anweisung und assert-Anweisung -

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.