[ Team LiB ] Previous Section Next Section

1.6 FizzBuzz Switched

Example 1-6 is another version of the FizzBuzz game. This version uses a switch statement instead of nested if/else statements to determine what its output should be for each number. Take a look at the example first, then read the explanation of switch.

Example 1-6. FizzBuzz2.java
package je3.basics;

 * This class is much like the FizzBuzz class, but uses a switch statement
 * instead of repeated if/else statements
public class FizzBuzz2 {
    public static void main(String[  ] args) {
        for(int i = 1; i <= 100; i++) { // count from 1 to 100
            switch(i % 35) {      // What's the remainder when divided by 35?
            case 0:                      // For multiples of 35...
                System.out.print("fizzbuzz ");  // print "fizzbuzz".
                break;                          // Don't forget this statement!
            case 5: case 10: case 15:    // If the remainder is any of these
            case 20: case 25: case 30:   // then the number is a multiple of 5
                System.out.print("fizz ");      // so print "fizz".
            case 7: case 14: case 21: case 28:  // For any multiple of 7...
                System.out.print("buzz ");      // print "buzz".
            default:                            // For any other number...
                System.out.print(i + " ");      // print the number.
        System.out.println( );

The switch statement acts like a switch operator at a busy rail yard, switching a train (or the execution of a program) to the appropriate track (or piece of code) out of many potential tracks. A switch statement is often an alternative to repeated if/else statements, but it only works when the value being tested is an integer (i.e., long, float, double, boolean, and reference types such as String objects are not allowed) and when the value is being tested against constant values. The basic syntax of the switch statement is:

switch(expression) {

The switch statement is followed by an expression in parentheses and a block of code in curly braces. After evaluating the expression, the switch statement executes certain code within the block, depending on the integral value of the expression. How does the switch statement know where to start executing code for which values? This information is indicated by case: labels and with the special default: label. Each case: label is followed by an integral value. If the expression evaluates to that value, the switch statement begins executing code immediately following that case: label. If there is no case: label that matches the value of the expression, the switch statement starts executing code following the default: label, if there is one. If there is no default: label, switch does nothing.

The switch statement is an unusual one because each case doesn't have its own unique block of code. Instead, case: and default: labels simply mark various entry points into a single large block of code. Typically, each label is followed by several statements and then a break statement, which causes the flow of control to exit out of the block of the switch statement. If you don't use a break statement at the end of the code for a label, the execution of that case "drops through" to the next case. If you want to see this in action, remove the break statements from Example 1-6 and see what happens when you run the program. Forgetting break statements within a switch statement is a common source of bugs.

    [ Team LiB ] Previous Section Next Section