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看,就知道了嘛,最终如二楼所说!