码迷,mamicode.com
首页 > 编程语言 > 详细

Java中Return和Finally执行顺序的实现

时间:2014-10-05 21:16:49      阅读:237      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   color   io   os   ar   java   for   

下面这段代码的执行结果是怎样的呢?

  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代码的字节码:

  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语句被分为两部分:istore 4和iload 4&ireturn,在store和load之间插入的是finally代码,x的值首先被存放到一个指定的位置,再执行finally语句,这时finally中的代码已无法影响返回值了。

Java中Return和Finally执行顺序的实现

标签:style   blog   http   color   io   os   ar   java   for   

原文地址:http://blog.csdn.net/aigoogle/article/details/39805529

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!