陷阱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语句块,而不至于发生错误。