以字节码角度解释return和finally的执行顺序?
来源:互联网 发布:python http请求 编辑:程序博客网 时间:2024/06/06 03:12
前言(Preface):
关于return和finally的执行顺序,算是一个“老梗”了吧,大家众说纷纭,相信很多人已经看过很多版本的解释。但有些人可能只是通过简单的代码测试得出来的结论,没有从根本上解释这个问题。Java编译器把代码编译成字节码,我们通过反汇编字节码,查看字节码指令顺序,能根本地解释return和finally的执行先后问题。
问题(What):
return和finally的执行顺序是怎么样的(无异常抛出的情况下)?
解答(How):
求出返回值--->另外开辟空间,存放返回值的副本--->执行finally--->return返回值的副本
分析(Why):
程序代码段如下(无异常抛出)
public static void main(String[] args) {System.out.println(test02());}public static String test02(){String t = null;try {t = "try";return t;} catch (Exception e) {}finally{t = "finnally";}return t;}
执行该段代码,输出:try
使用javap -c Test反汇编该段代码得到对应test02的字节码指令:
下面对字节码作出分析:
1. 执行finally之前,会执行aload_0取出try,再执行astore_3(第5-6行),astore_3的目的是复制返回值(try, 常量或者引用)的一个副本,即变量3
2. 接着执行finally,改变 t 的值,此时t 的值是finally(7-9行)
3. 最后load出变量3,再将其返回(10-11行)
结论(Conclusion):
执行finally之前,求出返回值,比如return “str1”+ "str2",接着程序会另外开辟空间复制返回值的一个副本,再执行finally,等到执行完finally,再将副本return。
思考(More):
如果返回值是自定义类,会是什么情况呢?情况跟上面是一样的,只不过副本变成了一个对象引用。详细在此就不作分析了。
另外,在下只是分享自己学习后的观点看法,若有疏忽或错误的地方,还望指教
未完待续。
- 以字节码角度解释return和finally的执行顺序?
- 从字节码的角度来看try-catch-finally和return的执行顺序
- 从执行角度解释:return与finally执行顺序
- java中return与finally的执行顺序分析(根据字节码分析)
- java中return与finally的执行顺序分析(根据字节码分析)
- 探究java的finally和return的执行顺序
- java try语句块 finally和return 的执行顺序
- Java异常处理---finally和return的执行顺序
- Java中Return和Finally执行顺序的实现
- java中的return 语句和finally的执行顺序关系
- Java中Return和Finally执行顺序的实现
- Java中return和finally的执行顺序
- Java中,return和finally的执行顺序
- Java中finally和return的执行顺序
- Java中try{return} finally中return 和finally的执行顺序
- return finally执行顺序
- java中return和finally执行顺序
- finally和return执行顺序问题
- 不修改代码就能优化ASP.NET网站性能的一些方法
- 朴素贝叶斯分类
- 在windows平台上安装部署redmine
- 映射CapsLock为Ctrl
- 用Java读取Properties文件六种方法
- 以字节码角度解释return和finally的执行顺序?
- android 图片缩放
- 把现有Xcode项目上传到SVN服务器
- 删除Xcode下的插件
- http长连接和短连接!
- GDB详解
- 1.1.2 安装(Installation)
- BIOS与UEFI、MBR和GPT(转)
- redis数据类型 - list类型