以下这段代码的运行结果是如何的呢?
- publc int test(){
- int x;
- try{
- x = 1;
- return x;
- }catch(Exception e){
- x = 2;
- return x;
- }finally{
- x = 3;
- }
- }
相信对Java比較熟悉的朋友立即会说出正确答案:正常返回1。异常返回2。 我第一次看到这段代码时,对于finally里面的x=3产生了疑惑,不确定最后返回的x是否变成了3。直到从《深入理解Java虚拟机》里面找到了这段代码的字节码,才明确其执行机制。
以下是上面这段Java代码的字节码:
- public int test();
- Code:
- Stack=1, Locals=5, Args_size=1
- 0: iconst_1
- 1: istore_1
- 2: iload_1
- 3: istore 4
- 5: iconst_3
- 6: istore_1
- 7: iload 4
- 9: ireturn
- 10: astore_2
- 11: iconst_2
- 12: istore_1
- 13: iload_1
- 14: istore 4
- 16: iconst_3
- 17: istore_1
- 18: iload 4
- 20: ireturn
- 21: astore_3
- 22: iconst_3
- 23: istore_1
- 24: aload_3
- 25: athrow
从上面的字节码能够看出,Return语句被分为两部分:iload 4和ireturn,在store和load之间插入的是finally代码。x的值首先被存放到一个指定的位置,再运行finally语句。这时finally中的代码已无法影响返回值了。
本文转自mfrbuaa博客园博客,原文链接:http://www.cnblogs.com/mfrbuaa/p/5219544.html,如需转载请自行联系原作者