switch-case ersetzt komplizierte Mehrfachverzweigungen
Die Verzweigung kann primitive byte-, short-,
char-
und int
-Werte, jedoch
keine long, float
oder gar Objekte
prüfen. Zudem kann auch auf Enumerations
und Strings
geprüft werden. Die switch-case-Verzweigung
entspricht einer Mehrfachverzweigung mit if
.
Der Wert hinter dem switch
wird
nacheinander mit den hinter der Sprungmarke case
aufgeführten Werten verglichen. Bei
Übereinstimung wird die jeweilige, dort notierte
Anweisung ausgeführt. Trifft keine
Übereinstimmung zu, kann optional mit der
Sprungmarke default
eine Standardanweisung
ausgeführt werden.
public class SwitchCaseClass {
public static void main(String[] args){
int i=2;
switch(i){
case 0:
System.out.println("i ist null");
break;
case 1:
System.out.println("i ist eins");
break;
case 2:
System.out.println("i ist zwei");
break;
case 3:
System.out.println("i ist drei");
break;
default:
System.out.println("i liegt nicht zwischen null und drei");
break;
}
}
}
Es ist wichtig darauf zu achten, dass nach
Ausführung einer Anweisung der Schleifendurchlauf
mit break unterbrochen wird, da die folgenden
Sprungmarken sonst ebenfalls geprüft und die dort
vorhandenen Anweisungen ggf. ausgeführt werden.
Das
letzte break
im Quelltext nach dem default
-Statement
ist nicht zwingend erforderlich, wird jedoch von Oracle
empfohlen1, um die
Fehleranfälligkeit des Codes zu reduzieren.
Mit der Java-Version 1.7 wurde die Möglichkeit eingeführt, auch auf Strings zu prüfen. Ein Beispiel sieht wie folgt aus:
String s = "Hundefutter"; switch (s) { case "Marmelade": System.out.println("Prima zum Frühstück"); break; case "Pizza": System.out.println("Immer wieder gerne"); break; case "Hundefutter": System.out.println("Pfui Teufel"); break; default: System.out.println("Keinen Hunger?"); break; }
An dieser Stelle sei auf einen häufigen Fehler hingewiesen:
int i = 24; switch (i) { case i>12: // Fehler System.out.println(i); break; default: break; }
Den Wert von i dann auszugeben, wenn er höher als
12 ist gelingt nicht, da es sich bei i>12
um einen boolschen Ausdruck handelt, auf den nicht
gefiltert werden kann!
Multiple case-Statements
Mehrere case
-Statements können auch
gruppiert werden. Dies muss bis Java 11 auf die folgende
Weise erfolgen, was letztlich mehreren Sprungmarken mit
fehlenden Anweisungen entspricht. Man beachte den
Doppelpunkt nach jedem case
-Statement!
int i = 24; switch (i) { case 0: case 24: case 13: System.out.println(i); break; default: break; }
v.12 Ab Java 122 lässt sich dies
etwas vereinfachen, indem hinter den case
-Sprungmarken
die Werte als Komma-separierte Liste notiert werden. Als
Beispiel hier die zeitabhängige Ausgabe einer
Grußformel. Auch hier muss wieder jedes case
-Statement
mit break
beendet werden.
int hour = LocalDateTime.now().getHour(); switch (hour) { case 22, 23, 0, 1, 2, 3, 4: System.out.println("Gute Nacht!"); break; case 5, 6, 7, 8, 9, 10: System.out.println("Guten Morgen!"); break; case 18, 19, 20, 21: System.out.println("Guten Abend!"); break; default: System.out.println("Guten Tag!"); break; }
Switch-Ausdrücke
Mit Java 12 werden sog. switch-Ausdrücke zunächst als Preview Features eingeführt. Sie liefern einen Rückgabewert, was die Verwendung der Verzweigung nochmals vereinfacht.
int hour = LocalDateTime.now().getHour(); String gruss = switch (hour) { case 22, 23, 0, 1, 2, 3, 4 -> "Gute Nacht!"; case 5, 6, 7, 8, 9, 10 -> "Guten Morgen!"; case 18, 19, 20, 21 -> "Guten Abend!"; default -> "Guten Tag!"; }; System.out.println(gruss);
Jede case-Sprungmarke filtert hier wie oben auf mehrere
Komma-separierte Werte. Das erste zutreffende Ergebnis
wird durch den Pfeiloperator und ohne Doppelpunkt direkt
einer Variablen zugewiesen und die Verzweigung
terminiert. Die break
-Anweisungen fallen
weg.
v.13 Mit Java 13 werden die
Möglichkeiten nochmals erweitert. Das
Schlüsselwort yield
wird zunächst
als Preview
Feature eingeführt und dann in Java 14
endgültig übernommen. Es liefert die
Rückgabe auf den gefilterten Wert und ersetzt die
nur vorübergehend erlaubte und deshalb hier nicht
vorgestellte Rückgabe eines Wertes durch break
.
Man beachte hier wiederum die notwendige Verwendung des
Doppelpunktes!
int hour = LocalDateTime.now().getHour(); String gruss = switch (hour) { case 22, 23, 0, 1, 2, 3, 4: yield "Gute Nacht!"; case 5, 6, 7, 8, 9, 10: yield "Guten Morgen!"; case 18, 19, 20, 21: yield "Guten Abend!"; default: yield "Guten Tag!"; }; System.out.println(gruss);
Bei der Formulierung eines Switch-Ausdrucks muss darauf geachtet werden, dass alle im jeweiligen Fall möglichen Werte berücksichtigt werden, um die Gültigkeit der Variablen zu gewährleisten. Kommentiert man in obigem Beipiel den Default-Fall in den Zeilen 9 und 10 aus, so wird das Beispiel nicht kompilieren.
Seit Java 21 können auch Objekte durch die switch-case-Fallunterscheidung geprüft werden. Siehe hierzu den gesonderten Artikel switch-case mit Objekten.
1)
https://docs.oracle.com/javase/tutorial/java/nutsandbolts/switch.html
2) In Java 12 wurden diese
Vereinfachnungen von Oracle als Preview
Feature eingeführt, die in Java 14
endgültig ins JDK übernommen wurden.
Wenn Ihnen javabeginners.de gefällt, freue ich mich über eine Spende an diese gemeinnützigen Organisationen.