关于javap编译后多出一部分代码以及finnaly块中加return 无法抛出异常的看法
2016-08-04 18:29
375 查看
先看代码
比较简单,之前知道finally块如果没有返回语句是不影响return的,但是今天突然想从jvm指令的角度去看看为什么,却发现,多出了一行 iinc 0,1的指令,见下图
刚开始有点莫名其妙,后来发现是不是finally块里的东西被优化到前面去了,finally里面又加了一句代码
验证了猜想,可是这是为什么呢,个人理解是jvm做了优化,优化之后可以在不出现异常的情况下,指令不用跳转,finally里面的语句总是要执行的,也可以看到,finally块里面的语句涉及到的i,是通过istore复制过来的,并不会影响return的值。当发生异常时,才进去到编译之后的finally块的代码,这样也能看到最后一条指令是athrow。
下面再看一下在finally里面加上return会出现生么情况。
God,这是什么。之前有人提到在finnaly增加return语句会吃掉抛出的异常问题。多出来的pop语句正好解释了这一点,当异常发生时,进入finnaly后第一条指令就是pop,将栈顶的异常抛出了,最后一条指令也换成了 ireturn。
finally去掉return之后的指令集。
static int test() throws Exception{ int i = 0; try { i = i+2; return i; } finally{ i=i+1; } }
比较简单,之前知道finally块如果没有返回语句是不影响return的,但是今天突然想从jvm指令的角度去看看为什么,却发现,多出了一行 iinc 0,1的指令,见下图
刚开始有点莫名其妙,后来发现是不是finally块里的东西被优化到前面去了,finally里面又加了一句代码
static int test() throws Exception{ int i = 0; try { i = i+2; return i; } finally{ i = i + 1; i = i + 3; } }
验证了猜想,可是这是为什么呢,个人理解是jvm做了优化,优化之后可以在不出现异常的情况下,指令不用跳转,finally里面的语句总是要执行的,也可以看到,finally块里面的语句涉及到的i,是通过istore复制过来的,并不会影响return的值。当发生异常时,才进去到编译之后的finally块的代码,这样也能看到最后一条指令是athrow。
下面再看一下在finally里面加上return会出现生么情况。
static int test() throws Exception{ int i = 0; try { i = i+2; return i; } catch (Exception e) { // TODO: handle exception throw e; } finally{ i = i + 1; i = i + 3; } }
God,这是什么。之前有人提到在finnaly增加return语句会吃掉抛出的异常问题。多出来的pop语句正好解释了这一点,当异常发生时,进入finnaly后第一条指令就是pop,将栈顶的异常抛出了,最后一条指令也换成了 ireturn。
finally去掉return之后的指令集。
相关文章推荐
- 一个问题:关于finally中return吞掉catch块中抛出的异常
- 在递归调用时候可能return无法主动跳出使用主动抛出异常
- 无法捕获异常:Java关于在catch中抛出一个异常给外围函数却捕获不到该异常的思考
- Java 抛出异常(编译异常与运行时异常)以及ava.io.File包下的File类
- 关于linux下无法用gcc编译c++代码的原因
- 关于Magick++ 在readImage过程中异常抛出检测 Magick::readImage return exception
- 1 开发一个注重性能的JDBC应用程序不是一件容易的事. 当你的代码运行很慢的时候JDBC驱动程序并不会抛出异常告诉你。 本系列的性能提示将为改善JDBC应用程序的性能介绍一些基本的指导原则,这其中的原则已经被许多现有的JDBC应用程序编译运行并验证过。 这些指导原则包括: 正确的使用数据库MetaData方法 只获取需要的数据 选用最佳性能的功能 管理连
- C++ 关于 int char 以及 class 型 异常的抛出 20180315 day7
- 关于一次线上修改字段后推代码 抛出字段找不到的异常
- 关于在Spring配置特殊bean-分散配置的时候抛出的异常:无法找到元素 'context:component-scan' 的声明 的解决方法
- 关于编译4+2版本遇到的不是代码的问题和添加launcher以及svn上传问题
- 求ASP.NET开发的公司网站关于产品展示以及成功案例的页面代码
- 关于《对某代码编译检查系统的分析》
- [原创]关于《精通QT4编程》第一个例子无法编译的问题的解答
- chun关于unix高级编程代码的编译问题
- 关于Eclipse无法重新编译java文件的处理方法之一
- VB6:关于“Only public user defined types defined in public object modules can be used as parameters or return types for public procedures of class modules or as fields of public user defined types.”的编译错误
- 关于编译eMule0.48a 提示: zlib.lib(gzio.obj) : error LNK2019: 无法解析的外部符号 __imp__strerror ,该符号在函数 _gzerror 中被引用
- 关于QT/E安装,编译,以及执行
- 有必要澄清两个基本概念--算法和过程的关系以及关于程序设计方法论的一些看法