• The statements inside your source files are generally executed from top to bottom, in the order that they appear.


  • Control flow statements, however, break up the flow of execution by employing decision making, looping, and branching, enabling your program to conditionally execute particular blocks of code.


  • This section describes the decision-making statements (if-then, if-then-else, switch), the looping statements (for, while, do-while), and the branching statements (break, continue, return) supported by the Java programming language.



  • The if-then statement is the most basic of all the control flow statements.


  • It tells your program to execute a certain section of code only if a particular test evaluates to true.


  • For example, the Bicycle class could allow the brakes to decrease the bicycle's speed only if the bicycle is already in motion.


  • One possible implementation of the applyBrakes method could be as follows:


  •  
    void applyBrakes() {
        // the "if" clause: bicycle must be moving
        if (isMoving){ 
            // the "then" clause: decrease current speed
            currentSpeed--;
        }
    }
    
    

  • If this test evaluates to false (meaning that the bicycle is not in motion), control jumps to the end of the if-then statement.


  • In addition, the opening and closing braces are optional, provided that the "then" clause contains only one statement:


  •  
    void applyBrakes() {
        // same as above, but without braces 
        if (isMoving)
            currentSpeed--;
    }
    
    

  • Deciding when to omit the braces is a matter of personal taste. Omitting them can make the code more brittle. As only one statement inside the if will be executed and the second will be ignored.


  • If a second statement is later added to the "then" clause, a common mistake would be forgetting to add the newly required braces.


  • The compiler cannot catch this sort of error; you'll just get the wrong results.



  • The if-then-else statement provides a secondary path of execution when an "if" clause evaluates to false.


  • You could use an if-then-else statement in the applyBrakes method to take some action if the brakes are applied when the bicycle is not in motion.


  • In this case, the action is to simply print an error message stating that the bicycle has already stopped.


  •  
    void applyBrakes() {
        if (isMoving) {
            currentSpeed--;
        } else {
            System.err.println("The bicycle has already stopped!");
        } 
    }
    
    

  • The following program, IfElseDemo, assigns a grade based on the value of a test score: an A for a score of 90% or above, a B for a score of 80% or above, and so on.


  •  
    
    class IfElseDemo {
        public static void main(String[] args) {
    
            int testscore = 76;
            char grade;
    
            if (testscore >= 90) {
                grade = 'A';
            } else if (testscore >= 80) {
                grade = 'B';
            } else if (testscore >= 70) {
                grade = 'C';
            } else if (testscore >= 60) {
                grade = 'D';
            } else {
                grade = 'F';
            }
            System.out.println("Grade = " + grade);
        }
    }
    The output from the program is:
    
        Grade = C
    
    

  • You may have noticed that the value of testscore can satisfy more than one expression in the compound statement: 76 >= 70 and 76 >= 60.


  • However, once a condition is satisfied, the appropriate statements are executed (grade = 'C';) and the remaining conditions are not evaluated.



  • Unlike if-then and if-then-else statements, the switch statement can have a number of possible execution paths.


  • A switch works with the byte, short, char, and int primitive data types.


  • It also works with enumerated types, the String class, and a few special classes that wrap certain primitive types: Character, Byte, Short, and Integer.


  • The following code example, SwitchDemo, declares an int named month whose value represents a month.


  • The code displays the name of the month, based on the value of month, using the switch statement.


  •  
    public class SwitchDemo {
        public static void main(String[] args) {
    
            int month = 8;
            String monthString;
            switch (month) {
                case 1:  monthString = "January";
                         break;
                case 2:  monthString = "February";
                         break;
                case 3:  monthString = "March";
                         break;
                case 4:  monthString = "April";
                         break;
                case 5:  monthString = "May";
                         break;
                case 6:  monthString = "June";
                         break;
                case 7:  monthString = "July";
                         break;
                case 8:  monthString = "August";
                         break;
                case 9:  monthString = "September";
                         break;
                case 10: monthString = "October";
                         break;
                case 11: monthString = "November";
                         break;
                case 12: monthString = "December";
                         break;
                default: monthString = "Invalid month";
                         break;
            }
            System.out.println(monthString);
        }
    }
    
    

  • In this case, August is printed to standard output.


  • The body of a switch statement is known as a switch block.


  • A statement in the switch block can be labeled with one or more case or default labels.


  • The switch statement evaluates its expression, then executes all statements that follow the matching case label.


  • You could also display the name of the month with if-then-else statements:


  •  
    
    int month = 8;
    if (month == 1) {
        System.out.println("January");
    } else if (month == 2) {
        System.out.println("February");
    }
    ...  // and so on
    
    

  • Deciding whether to use if-then-else statements or a switch statement is based on readability and the expression that the statement is testing.


  • An if-then-else statement can test expressions based on ranges of values or conditions, whereas a switch statement tests expressions based only on a single integer, enumerated value, or String object.


  • Another point of interest is the break statement.


  • Each break statement terminates the enclosing switch statement.


  • Control flow continues with the first statement following the switch block.


  • The break statements are necessary because without them, statements in switch blocks fall through: All statements after the matching case label are executed in sequence, regardless of the expression of subsequent case labels, until a break statement is encountered.


  • The program SwitchDemoFallThrough shows statements in a switch block that fall through. The program displays the month corresponding to the integer month and the months that follow in the year:


  •  
    public class SwitchDemoFallThrough {
    
        public static void main(String[] args) {
            java.util.ArrayList futureMonths =
                new java.util.ArrayList();
    
            int month = 8;
    
            switch (month) {
                case 1:  futureMonths.add("January");
                case 2:  futureMonths.add("February");
                case 3:  futureMonths.add("March");
                case 4:  futureMonths.add("April");
                case 5:  futureMonths.add("May");
                case 6:  futureMonths.add("June");
                case 7:  futureMonths.add("July");
                case 8:  futureMonths.add("August");
                case 9:  futureMonths.add("September");
                case 10: futureMonths.add("October");
                case 11: futureMonths.add("November");
                case 12: futureMonths.add("December");
                         break;
                default: break;
            }
    
            if (futureMonths.isEmpty()) {
                System.out.println("Invalid month number");
            } else {
                for (String monthName : futureMonths) {
                   System.out.println(monthName);
                }
            }
        }
    }
    
    
    
    This is the output from the code:
    
    August
    September
    October
    November
    December
    
    
    

  • Technically, the final break is not required because flow falls out of the switch statement.


  • Using a break is recommended so that modifying the code is easier and less error prone.


  • The default section handles all values that are not explicitly handled by one of the case sections.


  • The following code example, SwitchDemo2, shows how a statement can have multiple case labels.


  • The code example calculates the number of days in a particular month:


  •  
    class SwitchDemo2 {
        public static void main(String[] args) {
    
            int month = 2;
            int year = 2000;
            int numDays = 0;
    
            switch (month) {
                case 1: case 3: case 5:
                case 7: case 8: case 10:
                case 12:
                    numDays = 31;
                    break;
                case 4: case 6:
                case 9: case 11:
                    numDays = 30;
                    break;
                case 2:
                    if (((year % 4 == 0) && 
                         !(year % 100 == 0))
                         || (year % 400 == 0))
                        numDays = 29;
                    else
                        numDays = 28;
                    break;
                default:
                    System.out.println("Invalid month.");
                    break;
            }
            System.out.println("Number of Days = "
                               + numDays);
        }
    }
    This is the output from the code:
    
    Number of Days = 29
    
    


  • In Java SE 7 and later, you can use a String object in the switch statement's expression.


  • The following code example, StringSwitchDemo, displays the number of the month based on the value of the String named month:


  •  
    public class StringSwitchDemo {
    
        public static int getMonthNumber(String month) {
    
            int monthNumber = 0;
    
            if (month == null) {
                return monthNumber;
            }
    
            switch (month.toLowerCase()) {
                case "january":
                    monthNumber = 1;
                    break;
                case "february":
                    monthNumber = 2;
                    break;
                case "march":
                    monthNumber = 3;
                    break;
                case "april":
                    monthNumber = 4;
                    break;
                case "may":
                    monthNumber = 5;
                    break;
                case "june":
                    monthNumber = 6;
                    break;
                case "july":
                    monthNumber = 7;
                    break;
                case "august":
                    monthNumber = 8;
                    break;
                case "september":
                    monthNumber = 9;
                    break;
                case "october":
                    monthNumber = 10;
                    break;
                case "november":
                    monthNumber = 11;
                    break;
                case "december":
                    monthNumber = 12;
                    break;
                default: 
                    monthNumber = 0;
                    break;
            }
    
            return monthNumber;
        }
    
        public static void main(String[] args) {
    
            String month = "August";
    
            int returnedMonthNumber =
                StringSwitchDemo.getMonthNumber(month);
    
            if (returnedMonthNumber == 0) {
                System.out.println("Invalid month");
            } else {
                System.out.println(returnedMonthNumber);
            }
        }
    }
    The output from this code is 8.
    
    

  • The String in the switch expression is compared with the expressions associated with each case label as if the String.equals method were being used.


  • In order for the StringSwitchDemo example to accept any month regardless of case, month is converted to lowercase (with the toLowerCase method), and all the strings associated with the case labels are in lowercase.


  • Note: This example checks if the expression in the switch statement is null.


  • Ensure that the expression in any switch statement is not null to prevent a NullPointerException from being thrown.