Java的捕获异常问题 try finally

问题描述:

public class Test {

/**
 * @param args add by zxx ,Dec 9, 2008
 */
public static void main(String[] args) {
    // TODO Auto-generated method stub
    System.out.println(new Test().test());
}

static int test()
{
    int x = 1;
    try
    {
        return x;
    }
    finally
    {
        ++x;
    }
}

}
运行结果是:1

不是说finally在return之前执行吗?

finally是先执行,但是返回的是之前x,因为x作为返回值已经放在计算栈上了。所以不要在finally写side effect的代码

…你自己试过也应该知道,try里面有return,则finally会在return后执行。

Java中try-catch-finally(或者try-finally)结构的执行顺序是:

try块先执行,如果抛出异常,相应catch块执行,finally块总是最后执行

题中代码执行顺序如下:

1 进入try块
2 设置函数返回值为1
3 进入Finally块
4 自增x.
5 退出函数,并返回之前设置的返回值1

return语句也是表达式语句,其值(即函数的返回值)在第2步已经确定。

Java在执行finally之前,会记录try或者catch分支中需要返回值的地址,然后执行finally分支,最后才是return那个地址的值。
所以,Java编译器会建议不要在finally里面操作返回值,因为会对影响真实的返回值的。

自己Debug看,就知道了嘛,最终如二楼所说!