Theory:Switch statement
# When a conditional statement is not so good
Suppose you need to write a program that performs different actions depending on the value of a variable. For example, choosing an action from the menu of a game. To do that you can use a conditional statement with multiple branches as shown below.
int action = ...; // a certain value from 1 to 4 if (action == 1) { System.out.println("Starting a new game..."); } else if (action == 2) { System.out.println("Loading a saved game"); } else if (action == 3) { System.out.println("Displaying help..."); } else if (action == 4) { System.out.println("Exiting..."); } else { System.out.println("Unsuitable action, please, try again"); }1
2
3
4
5
6
7
8
9
10
11
12
13Of course, this code handles the task. But if your conditional statement has a lot of branches, it can be hard to understand for people.
# Three keywords: switch, case, and default
The switch statement provides a way to choose between multiple cases based on the value of a single variable (not an expression!). The variable can be an integer number, character, string, or enumeration. The last two types will be studied further.
Using the switch statement, the previous code will look like this:
switch (action) { case 1: System.out.println("Starting a new game..."); break; case 2: System.out.println("Loading a saved game"); break; case 3: System.out.println("Displaying help..."); break; case 4: System.out.println("Exiting..."); break; default: System.out.println("Unsuitable action, please, try again"); }1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16As you can see, this code is well-structured and easier to read than the equal conditional statement. We have not explained the keywords
switch,caseandbreakyet, but you can already guess what they mean.# The general form of the switch statement
The most general form of the switch statement is the following
switch (variable) { case value1: // do something here break; case value2: // do something here break; //... other cases case valueN: // do something here break; default: // do something by default break; // it can be omitted }1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17The
switchandcasekeywords are always required here. The keywordsbreakanddefaultare optional. The keywordbreakstops the execution of the whole switch statement, not just one case.If a
casedoes not have thebreakkeyword, the followingcasewill be evaluated as well, including thedefaultcase. Thedefaultcase is also evaluated if there's no othercasethat matches the variable value. Thebreakkeyword in thedefaultbranch is optional and can be omitted.A
casesection may contain any block of code, even a nestedswitchstatement, however it is recommended to avoid deeply nested code structures wherever possible.# An example with "zero", "one" and "two"
Let's consider another example. The following code outputs the names of integer numbers or a default text. This switch statement has three base cases and a single default case.
int val = ...; switch (val) { case 0: System.out.println("zero"); break; case 1: System.out.println("one"); break; case 2: System.out.println("two"); break; default: System.out.println("The value is less than zero or greater than two"); }1
2
3
4
5
6
7
8
9
10
11
12
13
14If the
valis 0, the code prints:zero1If the
valis 1, the code prints:one1if the
valis 10, the code prints:The value is less than zero or greater than two1If you forget the keyword
breakin a case, the compiler won't consider it an error. Let's remove it from the second case (case 1) and assign 1 toval. The program prints:one two1
2Omitting
breakkeyword is not a good practice. Try to avoid it.Java 12–14 introduced some new features allowing to use switch as an expression (opens new window).
# Conclusion
When you have a limited number of cases to choose from, switch statements can help you avoid unnecessary nested if-else constructions. For that, you need the
switchkeyword to introduce the value to evaluate, andcasefor each of the possible values. Do not forget to also use thebreakkeyword to avoid evaluating extra cases anddefaultbranch to indicate the default behavior.