博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java中Return和Finally运行顺序的实现
阅读量:6606 次
发布时间:2019-06-24

本文共 1232 字,大约阅读时间需要 4 分钟。

以下这段代码的运行结果是如何的呢?

[java] 
  1. publc int test(){  
  2.     int x;  
  3.     try{  
  4.         x = 1;  
  5.         return x;  
  6.     }catch(Exception e){  
  7.         x = 2;  
  8.         return x;  
  9.     }finally{  
  10.         x = 3;  
  11.     }  
  12. }  

相信对Java比較熟悉的朋友立即会说出正确答案:正常返回1。异常返回2。

我第一次看到这段代码时,对于finally里面的x=3产生了疑惑,不确定最后返回的x是否变成了3。直到从《深入理解Java虚拟机》里面找到了这段代码的字节码,才明确其执行机制。

以下是上面这段Java代码的字节码:

[java] 
  1. public int test();  
  2.   Code:  
  3.    Stack=1, Locals=5, Args_size=1  
  4.    0:   iconst_1   //将1写入栈顶  
  5.    1:   istore_1   //将栈顶值(1)写入第2个int型本地变量  
  6.    2:   iload_1    //将第2<span style="font-family: Arial, Helvetica, sans-serif;">个int型本地变量load到栈顶(Return语句的開始)</span>  
  7.    3:   istore  4  //保存栈顶值到<span style="font-family: Arial, Helvetica, sans-serif;">第4个int型本地变量</span>,此时x=1  
  8.    5:   iconst_3   //将3写入栈顶(Finally開始)  
  9.    6:   istore_1   //将3写入<span style="font-family: Arial, Helvetica, sans-serif;">第2个int型本地变量</span>  
  10.    7:   iload   4  //将<span style="font-family: Arial, Helvetica, sans-serif;">第4个int型本地变量的值laod到栈顶</span>  
  11.    9:   ireturn    //返回栈顶的值  
  12.    10:  astore_2  
  13.    11:  iconst_2  
  14.    12:  istore_1  
  15.    13:  iload_1  
  16.    14:  istore  4  
  17.    16:  iconst_3  
  18.    17:  istore_1  
  19.    18:  iload   4  
  20.    20:  ireturn  
  21.    21:  astore_3  
  22.    22:  iconst_3  
  23.    23:  istore_1  
  24.    24:  aload_3  
  25.    25:  athrow  

从上面的字节码能够看出,Return语句被分为两部分:iload 4和ireturn,在store和load之间插入的是finally代码。x的值首先被存放到一个指定的位置,再运行finally语句。这时finally中的代码已无法影响返回值了。

本文转自mfrbuaa博客园博客,原文链接:http://www.cnblogs.com/mfrbuaa/p/5219544.html,如需转载请自行联系原作者

你可能感兴趣的文章
Shell脚本 常用命令总结 二
查看>>
Centos(Yum源更改)
查看>>
冰球游戏大概的模块
查看>>
PHP中htmlentities和htmlspecialchars的区别
查看>>
Best Part
查看>>
ClassPathXMLApplicationContext上下文加载过程
查看>>
JS模拟select下拉菜单
查看>>
线性方程组迭代求解——Jacobi迭代算法(Python实现)
查看>>
vmware workstation14永久激活密钥分享
查看>>
PHP面向对象的进阶学习(抽像类、接口、final、类常量)
查看>>
iOS 多线程 之 GCD(大中枢派发)(一)
查看>>
mysql用户与权限管理笔记
查看>>
Myeclipse中打开接口实现类的快捷键
查看>>
<20190516> 一次比较糟糕的售后维修体验(某硕主板)
查看>>
iOS网络篇2-http协议通信规则
查看>>
删除sql dump中的AUTO_INCREMENT
查看>>
使用JdbcTemplate和JdbcDaoSupport
查看>>
C博客作业--指针
查看>>
版本12.2.0.1.0数据库,复制种子数据库快速创建租户数据库PDB
查看>>
吴忠军中华演出网
查看>>