DEV Community

Thierry Chau
Thierry Chau

Posted on

Understanding Fall-Through in Java Switch-Case Statements

In Java programming, the switch-case statement is a control structure used to execute one block of code among many based on the value of a variable. It can be more efficient and readable than using multiple if-else statements. One important concept to understand when working with switch-case statements is "fall-through."

What is Fall-Through?

Fall-through occurs when the code execution continues from one case to the next without encountering a break statement. By default, after a matching case block is executed, the control flow will fall through to the subsequent case blocks until a break statement is encountered or the switch statement ends.

Syntax of a Switch-Case Statement

Here is the basic syntax of a switch-case statement in Java:

switch (expression) {
    case value1:
        // code block
        break;
    case value2:
        // code block
        break;
    default:
        // default code block
}
Enter fullscreen mode Exit fullscreen mode

Example of Fall-Through

Let's look at an example to understand how fall-through works:

int day = 2;
switch (day) {
    case 1:
        System.out.println("Monday");
    case 2:
        System.out.println("Tuesday");
    case 3:
        System.out.println("Wednesday");
    default:
        System.out.println("Other day");
}
Enter fullscreen mode Exit fullscreen mode

In this example, the output will be:

Tuesday
Wednesday
Other day
Enter fullscreen mode Exit fullscreen mode

Explanation

When day is equal to 2, the case 2 block is executed, printing "Tuesday." Since there is no break statement after case 2, the execution continues to case 3 and then to the default case, printing "Wednesday" and "Other day" respectively. This is a classic example of fall-through behavior.

Preventing Fall-Through

To prevent fall-through, you should end each case with a break statement:

int day = 2;
switch (day) {
    case 1:
        System.out.println("Monday");
        break;
    case 2:
        System.out.println("Tuesday");
        break;
    case 3:
        System.out.println("Wednesday");
        break;
    default:
        System.out.println("Other day");
        break;
}
Enter fullscreen mode Exit fullscreen mode

Now, the output will be:

Tuesday
Enter fullscreen mode Exit fullscreen mode

Intentional Fall-Through

Sometimes, fall-through can be used intentionally to execute multiple cases with the same block of code:

int day = 2;
switch (day) {
    case 1:
    case 2:
    case 3:
    case 4:
    case 5:
        System.out.println("It's a weekday");
        break;
    case 6:
    case 7:
        System.out.println("It's a weekend");
        break;
    default:
        System.out.println("Invalid day");
}
Enter fullscreen mode Exit fullscreen mode

In this example, day values 1 through 5 will all result in "It's a weekday" being printed.

Conclusion

Understanding fall-through in switch-case statements is crucial for writing clear and bug-free Java code. While fall-through can be useful in certain scenarios, it is generally a good practice to use break statements to prevent unintended behavior.

Note: Unlike Java, the case-when construct in Ruby does not exhibit fall-through behavior. Each when clause is independent, and execution does not automatically continue to subsequent when clauses without explicit instructions.

Top comments (4)

Collapse
 
wldomiciano profile image
Wellington Domiciano

Nice!

And since Java 14, another way to prevent fall-through is using the switch
rule
, which use -> to introduce either a switch rule expression.

 int day = 2;
  switch (day) {
  case 1 -> System.out.println("Monday");
  case 2 -> System.out.println("Tuesday");
  case 3 -> System.out.println("Wednesday");
  default -> System.out.println("Other day");
}
// Output: Tuesday
Enter fullscreen mode Exit fullscreen mode

It's possible to use block to group multiple statements:

int day = 2;
  switch (day) {
  case 1 -> System.out.println("Monday");
  case 2 -> {
    System.out.print("Tuesday ");
    System.out.println("Yayyy!!!");
  }
  case 3 -> System.out.println("Wednesday");
  default -> System.out.println("Other day");
}
// Output: Tuesday Yayyy!!!
Enter fullscreen mode Exit fullscreen mode

And it's possible to use multiple case constants.

int day = 1;
  switch (day) {
  case 1, 2, 3, 4, 5 -> System.out.println("It's a weekday");
  case 6, 7 -> System.out.println("It's a weekend");
  default -> System.out.println("Invalid day");
}
// Output: It's a weekday
Enter fullscreen mode Exit fullscreen mode
Collapse
 
thierrychau profile image
Thierry Chau

Very interesting, thank you for this detailed comment!

Collapse
 
maximusinglorious profile image
MaximusInglorious

That's kinda neat.

Collapse
 
maximusinglorious profile image
MaximusInglorious

Nice article!