为什么switch case语句需要加入break


假设我们有如下这样一个switch语句:

Java代码   收藏代码
  1. public static void test(int index) {  
  2.     switch (index) {  
  3.     case 1:  
  4.         System.out.println(1);  
  5.     case 2:  
  6.         System.out.println(2);  
  7.     case 3:  
  8.         System.out.println(3);  
  9.     default:  
  10.         System.out.println("Default");  
  11.     }  
  12. }  

当我们在执行上面的方法时,如果我们传入的参数是1,那么会输出1、2、3和default,如果传入的参数是2,那么会输出2、3和default,这是为什么呢?这是因为switch的case语句是用来根据满足条件从确定的行开始执行的,如果不加入break语句跳出switch逻辑,则会一直往下执行,这也是为什么上面的测试代码会出现传入参数为2时会输出2、3和default。

为此,我们也可以看一下上面的代码编译后的class文件,通过eclipse打开后,我们可以看到如下内容:

Class代码   收藏代码
  1. public static void test(int index);  
  2.    0  iload_0 [index]  
  3.    1  tableswitch default: 49  
  4.         case 128  
  5.         case 235  
  6.         case 342  
  7.   28  getstatic java.lang.System.out : java.io.PrintStream [22]  
  8.   31  iconst_1  
  9.   32  invokevirtual java.io.PrintStream.println(int) : void [28]  
  10.   35  getstatic java.lang.System.out : java.io.PrintStream [22]  
  11.   38  iconst_2  
  12.   39  invokevirtual java.io.PrintStream.println(int) : void [28]  
  13.   42  getstatic java.lang.System.out : java.io.PrintStream [22]  
  14.   45  iconst_3  
  15.   46  invokevirtual java.io.PrintStream.println(int) : void [28]  
  16.   49  getstatic java.lang.System.out : java.io.PrintStream [22]  
  17.   52  ldc <String "Default"> [33]  
  18.   54  invokevirtual java.io.PrintStream.println(java.lang.String) : void [35]  
  19.   57  return  

 上面编译后的语句每行前面的数字是程序的指定序号,我们可以把它简单的理解为行号,我们可以看到数字为1的那行定义了一个switch指定,其默认会跳到49行,如果传入的参数是1则跳到28行执行,如果是2则跳到35行执行,如果是3则跳到42行执行。那么我们先来看程序的第28行到32行,其对应的就是调用System.out.println输出1,完了后没有特殊的指令,程序是会继续顺序执行的,也就是会依次执行35、38、直到57行结束。

如果我们把源程序的case语句末端都加上break语句,如下这样:

Java代码   收藏代码
  1. public static void test(int index) {  
  2.     switch (index) {  
  3.     case 1:  
  4.         System.out.println(1);  
  5.         break;  
  6.     case 2:  
  7.         System.out.println(2);  
  8.         break;  
  9.     case 3:  
  10.         System.out.println(3);  
  11.         break;  
  12.     default:  
  13.         System.out.println("Default");  
  14.         break;  
  15.     }  
  16. }  

 那么对应的编译的class文件通过Eclipse打开后可以看到如下内容:

Class代码   收藏代码
  1. public static void test(int index);  
  2.    0  iload_0 [index]  
  3.    1  tableswitch default: 58  
  4.         case 128  
  5.         case 238  
  6.         case 348  
  7.   28  getstatic java.lang.System.out : java.io.PrintStream [22]  
  8.   31  iconst_1  
  9.   32  invokevirtual java.io.PrintStream.println(int) : void [28]  
  10.   35  goto 66  
  11.   38  getstatic java.lang.System.out : java.io.PrintStream [22]  
  12.   41  iconst_2  
  13.   42  invokevirtual java.io.PrintStream.println(int) : void [28]  
  14.   45  goto 66  
  15.   48  getstatic java.lang.System.out : java.io.PrintStream [22]  
  16.   51  iconst_3  
  17.   52  invokevirtual java.io.PrintStream.println(int) : void [28]  
  18.   55  goto 66  
  19.   58  getstatic java.lang.System.out : java.io.PrintStream [22]  
  20.   61  ldc <String "Default"> [33]  
  21.   63  invokevirtual java.io.PrintStream.println(java.lang.String) : void [35]  
  22.   66  return  

 我们可以看到switch语句默认会执行58行,如果传入的参数是1则会执行28行,如果是2则会从38行开始执行,接着我们可以看到28行开始是执行的System.out.println(1)的逻辑,完了后会顺序执行到35行,35行的指令是会引导程序执行到第66行,也就是跳出了switch逻辑,对应我们的测试代码就是程序结束了。这也是为什么我们在使用switch语句时通常需要在每个case语句结束时加入break指令的原因。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值