Java开发之道
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

陷阱18 控制无效——缺少break的switch语句

在Java中switch语句也是一个经常使用的分支结构,但是在使用switch语句时,一定要注意以下两点:第一点是switch 语句只能接收整型值、字符值或枚举型值;第二点是在使用switch语句时,要在每个case语句块结束后,使用break语句结束整个switch语句的执行。

提示

在使用switch语句时,如果在case语句块结束后,没有使用break语句结束整个switch语句的执行,程序会从匹配的case 语句开始一直执行下去,直到遇到break 语句或执行完整个switch语句才能结束,这样会导致不符合条件的语句也会被执行。

接下来通过一个示例来说明为什么在使用switch语句时,在每个case语句块执行完以后,一定要用break语句结束整个switch语句的执行。

没添加break语句,导致程序结果错误,示例:

假设Java部门、C#部门、PHP部门和VB部门的部门编号分别为1、2、3和4,要求根据部门编号输出对应的部门名称。

    public class SwitchNoBreak {
      public static void showDepartment (int id){       // 通过部门编号id查询部门名称的方法
      switch (id){                                      // 使用id作为switch语句的表达式
              case 1:
                  System. out. println ("Java部门");      // 输出部门编号是1的部门
              ❶case 2:
                  System. out. println ("C#部门");        // 输出部门编号是2的部门
              ❷case 3:
                  System. out. println ("PHP部门");       // 输出部门编号是3的部门
              ❸case 4:
                  System. out. println ("VB部门");        // 输出部门编号是4的部门
      }
      }
      public static void main (String[] args) {
      showDepartment (2);                // 调用方法showDepartment输出编号是2的部门名称
      }
    }

运行本示例,将在控制台输出如图3.15所示的信息,其中,"PHP部门”和 "VB部门”是不符合部门编号是2的部门,只有 "C#部门”才是真正符合要求的。

图3.15 在控制台输出的部门名称

说明

本示例之所以将 "PHP 部门”和 "VB 部门”也输出到控制台,是因为在使用switch语句时,在每个case语句块后没有添加break语句,所以程序在执行完标记❶处的case语句块后,并没有结束switch语句的执行,而是继续往下执行,直到标记❷和标记❸处的case语句块执行完,才最终结束switch语句的执行,所以输出了如图3.15所示的3个部门,这样就会把用户弄糊涂,不知道哪个部门名称才是真正符合要求的。

添加break语句,程序输出正确的结果,示例:

对上一个示例进行更改,在case 语句块中添加break 语句,使程序能够输出正确的部门名称。

    public class SwitchNoBreak {
      public static void showDepartment (int id){       // 通过部门编号id查询部门名称的方法
      switch (id){                                      // 使用id作为switch语句的表达式
              case 1:
                  System. out. println ("Java部门");      // 输出部门编号是1的部门
                  break;
              case 2:
                  System. out. println ("C#部门");        // 输出部门编号是2的部门
                  break;
              case 3:
                  System. out. println ("PHP部门");       // 输出部门编号是3的部门
                  break;
              case 4:
                  System. out. println ("VB部门");        // 输出部门编号是4的部门
                  break;
      }
      }
      public static void main (String[] args) {
      showDepartment (2);                    // 调用方法showDepartment输出编号是2的部门名称
      }
    }

运行本示例,在控制台只输出了符合部门编号是2的 "C#部门”,而没有输出其他部门,如图3.16所示。

图3.16 在控制台只输出了 "C#部门”

说明

本示例之所以只输出了 "C#部门”,是由于在每个case语句块中都添加了break语句,因此当程序输出 "C#部门”后,继续往下执行,执行到break 语句,而switch 语句一旦执行break语句,将结束整个switch语句的执行,因而只输出了 "C#部门”。所以,在使用switch语句时,一定要在每个case语句块结束处添加break语句,使switch语句只执行满足要求的case语句块,而不至于发生错误。