java中switch case语句需要加入break的原因解析

所属分类: 软件编程 / java 阅读数: 40
收藏 0 赞 0 分享

java中switch case语句需要加入break的原因解析

           java 中使用switch case语句需要加入break 做了具体的实例分析,及编译源码,在源码中分析应该如何使用,大家可以参考下:

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

public static void test(int index) { 
  switch (index) { 
  case 1: 
    System.out.println(1); 
  case 2: 
    System.out.println(2); 
  case 3: 
    System.out.println(3); 
  default: 
    System.out.println("Default"); 
  } 
} 

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

 public static void test(int index);
   iload_0 [index]
    tableswitch default: 49
     case 1: 28
     case 2: 35
     case 3: 42
   getstatic java.lang.System.out : java.io.PrintStream [22]
   iconst_1
   invokevirtual java.io.PrintStream.println(int) : void [28]
   getstatic java.lang.System.out : java.io.PrintStream [22]
   iconst_2
   invokevirtual java.io.PrintStream.println(int) : void [28]
   getstatic java.lang.System.out : java.io.PrintStream [22]
   iconst_3
   invokevirtual java.io.PrintStream.println(int) : void [28]
   getstatic java.lang.System.out : java.io.PrintStream [22]
   ldc <String "Default"> [33]
   invokevirtual java.io.PrintStream.println(java.lang.String) : void [35]
   return

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

public static void test(int index) { 
  switch (index) { 
  case 1: 
    System.out.println(1); 
    break; 
  case 2: 
    System.out.println(2); 
    break; 
  case 3: 
    System.out.println(3); 
    break; 
  default: 
    System.out.println("Default"); 
    break; 
  } 
} 

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

public static void test(int index); 
  iload_0 [index] 
   tableswitch default: 58 
    case 1: 28 
    case 2: 38 
    case 3: 48 
  getstatic java.lang.System.out : java.io.PrintStream [22] 
  iconst_1 
  invokevirtual java.io.PrintStream.println(int) : void [28] 
  goto 66 
  getstatic java.lang.System.out : java.io.PrintStream [22] 
  iconst_2 
  invokevirtual java.io.PrintStream.println(int) : void [28] 
  goto 66 
  getstatic java.lang.System.out : java.io.PrintStream [22] 
  iconst_3 
  invokevirtual java.io.PrintStream.println(int) : void [28] 
  goto 66 
  getstatic java.lang.System.out : java.io.PrintStream [22] 
  ldc <String "Default"> [33] 
  invokevirtual java.io.PrintStream.println(java.lang.String) : void [35] 
  return 

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

 感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

更多精彩内容其他人还在看

spring boot 静态资源处理方法

本篇文章主要介绍了spring boot 静态资源处理方法。小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
收藏 0 赞 0 分享

详解spring boot 使用application.properties 进行外部配置

这篇文章主要介绍了详解spring boot 使用application.properties 进行外部配置,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
收藏 0 赞 0 分享

Java实现分页的前台页面和后台代码

这篇文章主要为大家详细介绍了Java实现分页的前台页面和后台代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

详解spring面向切面aop拦截器

spring中有很多概念和名词,比如过滤器、拦截器、aop等。这篇文章主要介绍了详解spring面向切面aop拦截器,有兴趣的可以了解一下。
收藏 0 赞 0 分享

Java easyui树形表格TreeGrid的实现代码

这篇文章主要为大家详细介绍了Java easyui树形表格TreeGrid的实现代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

Java的NIO与IO的详解及对比

这篇文章主要介绍了Java的NIO与IO的详解及对比的相关资料,需要的朋友可以参考下
收藏 0 赞 0 分享

Java中网络IO的实现方式(BIO、NIO、AIO)介绍

这篇文章主要介绍了Java中网络IO的实现方式(BIO、NIO、AIO)介绍的相关资料,需要的朋友可以参考下
收藏 0 赞 0 分享

Java 敏感信息加密处理

本文主要介绍了Java 敏感信息加密处理的相关知识:1)敏感信息加密处理我们要实现什么;2)敏感信息加密处理我做了些什么;3)敏感信息加密实现方法。具有很好的参考价值,下面跟着小编一起来看下吧
收藏 0 赞 0 分享

详解使用Spring3 实现用户登录以及权限认证

这篇文章主要介绍了详解使用Spring3 实现用户登录以及权限认证,这里整理了详细的代码,有需要的小伙伴可以参考下。
收藏 0 赞 0 分享

Java的内存机制详解

本文主要介绍了Java的内存机制的相关知识,具有很好的参考价值,下面跟着小编一起来看下吧
收藏 0 赞 0 分享
查看更多