你真的了解try{ return }finally{}中的return吗?

来源:互联网 发布:美容保健品 知乎 编辑:程序博客网 时间:2024/06/16 16:12

谁能给我我解释一下这段程序的结果为什么是2而不是3?

class Test {    public int aaa() {        int x = 1;        try {            return ++x;        } catch (Exception e) {        } finally {            ++x;        }        return x;    }    public static void main(String[] args) {        Test t = new Test();        int y = t.aaa();        System.out.println(y);    }}

解答:

如果try语句里有return,那么代码的行为如下:

  1. 如果有返回值,就把返回值保存到局部变量中。
  2. 执行JSR指令跳到finally语句里执行。
  3. 执行完finally语句后,返回之前保存在局部变量表里的值。

字节码文件解析:

这里写图片描述

大概讲讲指令操作顺序:

iconst_1: 把常数1进栈 —> istore_1: 栈顶元素出栈并把元素保存在本地变量表的第二个位置里(下标为1的位置里) —> iinc 1, 1 : 本地变量表的第二个元素自增1 —>iload_1:第二个元素进栈 —> istore_2:栈顶元素出栈并把元素保存在本地变量表的第2个位置里 —> iinc 1, 1 : 本地变量表的第二个元素自增1 —> iload_2:第二个元素进栈 (注意,此时栈顶元素为2)—> ireturn:返回栈顶元素。

上面流程栈和本地变量表的情况如下图:

这里写图片描述

出处:http://www.cnblogs.com/averey/p/4379646.html

0 0
原创粉丝点击