Aktionen

Switch-Anweisung in Java

Aus Java Tutorial - Java lernen

Mit einer Switch-Anweisung kann eine Variable auf Gleichheit gegenüber einer Liste von Werten getestet werden. Jeder Wert wird als Fall bezeichnet, und die einzuschaltende Variable wird für jeden Fall geprüft.

Syntax

Die Syntax der Switch-Anweisung lautet:

switch(expression) {
   case value :
      // Anweisungen
      break; // optional
   
   case value :
      // Anweisungen
      break; // optional
   
   // Sie können beliebig viele Fallaussagen haben.
   default : // Optional
      // Anweisungen
}

Die folgenden Regeln gelten für eine switch-Anweisung:

  • Die in einer Switch-Anweisung verwendete Variable kann nur ganze Zahlen, konvertierbare ganze Zahlen (Byte, Short, Char), Zeichenketten und Enums sein.
  • Sie können eine beliebige Anzahl case-Anweisungen innerhalb einer switch-Anweisung haben. Auf case folgt der Wert, mit dem verglichen werden soll, und ein Doppelpunkt.
  • Der Wert für ein case muss denselben Datentyp wie die Variable im switch haben und es muss eine Konstante oder ein Literal sein.
  • Wenn die einzuschaltende Variable gleich einem case ist, werden die auf diesen case folgenden Anweisungen ausgeführt, bis eine break-Anweisung erreicht wird.
  • Wenn eine Break-Anweisung erreicht wird, wird der switch beendet, und der Kontrollfluss springt zur nächsten Zeile nach der switch-Anweisung.
  • Nicht jeder Fall muss eine Unterbrechung enthalten. Wenn keine Unterbrechung auftritt, fällt der Kontrollfluss auf nachfolgende Fälle durch, bis eine Unterbrechung erreicht wird.
  • Eine switch-Anweisung kann einen optionalen Standardfall haben, der am Ende des Schalters erscheinen muss. Der Standardfall kann zur Ausführung einer Aufgabe verwendet werden, wenn keiner der Fälle zutrifft. Im Standardfall ist kein Bruch erforderlich.


Flussdiagramm

SwitchAnweisung.jpg

Quelle: www.tutorialspoint.com

Beispiel

public class Test {

   public static void main(String args[]) {
      // char grade = args[0].charAt(0);
      char grade = 'C';

      switch(grade) {
         case 'A' :
            System.out.println("Excellent!"); 
            break;
         case 'B' :
         case 'C' :
            System.out.println("Well done");
            break;
         case 'D' :
            System.out.println("You passed");
         case 'F' :
            System.out.println("Better try again");
            break;
         default :
            System.out.println("Invalid grade");
      }
      System.out.println("Your grade is " + grade);
   }
}

Kompilieren und führen Sie das obige Programm unter Verwendung verschiedener Befehlszeilenargumente aus. Dies führt zu folgendem Ergebnis:

Ausgabe

Well done
Your grade is C

Das yield-Keyword

Wenn man etwas weiter geht, gibt es die Möglichkeit, durch die Verwendung von Codeblöcken eine feinkörnige Kontrolle darüber zu erhalten, was auf der rechten Seite des Ausdrucks geschieht. In einem solchen Fall müssen wir das Schlüsselwort yield verwenden:

var result = switch (month) {
    case JANUARY, JUNE, JULY -> 3;
    case FEBRUARY, SEPTEMBER, OCTOBER, NOVEMBER, DECEMBER -> 1;
    case MARCH, MAY, APRIL, AUGUST -> {
        int monthLength = month.toString().length();
        yield monthLength * 4;
    }
    default -> 0;
};

Während unser Beispiel etwas willkürlich ist, geht es hier darum, dass wir hier Zugang zu mehr von der Sprache Java haben.

Rückgabe von inneren switch-Anweisungen

Als Folge der Unterscheidung zwischen switch-Anweisungen und switch-Ausdrücken ist es möglich, von innerhalb einer switch-Anweisung zurückzukehren, aber es ist uns nicht erlaubt, dies innerhalb eines switch-Ausdrucks zu tun.

Das folgende Beispiel ist vollkommen gültig und lässt sich kompilieren:

switch (month) {
    case JANUARY, JUNE, JULY -> { return 3; }
    default -> { return 0; }
}

Der folgende Code lässt sich jedoch nicht kompilieren, da wir versuchen, außerhalb eines umschließenden switch-Ausdrucks zurückzukehren:

var result = switch (month) {
    case JANUARY, JUNE, JULY -> { return 3; }
    default -> { return 0; }
};

Gründlichkeit

Bei der Verwendung von Switch-Statements ist es eigentlich egal, ob alle Fälle abgedeckt sind.

Der folgende Code ist zum Beispiel vollkommen gültig und lässt sich kompilieren:

switch (month) { 
    case JANUARY, JUNE, JULY -> 3; 
    case FEBRUARY, SEPTEMBER -> 1;
}

Bei switch-Ausdrücken besteht der Compiler jedoch darauf, dass alle möglichen Fälle abgedeckt sind. Der folgende Codeschnipsel würde sich zum Beispiel nicht kompilieren lassen, da es keinen Standardfall gibt und nicht alle möglichen Fälle abgedeckt sind:

var result = switch (month) {
    case JANUARY, JUNE, JULY -> 3;
    case FEBRUARY, SEPTEMBER -> 1;
}

Der switch-Ausdruck ist jedoch gültig, wenn alle möglichen Fälle abgedeckt sind, wie im folgenden Beispiel:

var result = switch (month) {
    case JANUARY, JUNE, JULY -> 3;
    case FEBRUARY, SEPTEMBER, OCTOBER, NOVEMBER, DECEMBER -> 1;
    case MARCH, MAY, APRIL, AUGUST -> 2;
}

Bitte beachten Sie, dass das obige Code-Snippet keinen Standardfall hat. Solange alle Fälle abgedeckt sind, ist der Schaltausdruck gültig.