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!