try中有return,finally还会执行吗?
转自:链接
try中有return,finally一定会执行。
The finally block always executes when the try block exits.`
观察如下代码,x的值是?:
public class FinallyTest {
public int method() {
int x = 1;
try{
++ x;
return x;
}catch(Exception e){
}finally{
++ x;
}
return x;
}
public static void main(String[] args) {
FinallyTest t = new FinallyTest();
int y = t.method();
System.out.println(y);
}
}
try中返回了x=2, finally语句中返回了x=3。
finally语句更靠后被return,为什么结果是2呢?
If the try clause executes a return, the compiled code does the following:
Saves the return value (if any) in a local variable.
Executes a jsr to the code for the finally clause.
Upon return from the finally clause, returns the value saved in the local variable.`
大意就是如果在try中return的情况下,先把try中将要return的值先存到一个本地变量中,即本例中的x=2将会被保存下来。接下来去执行finally语句,最后返回的是存在本地变量中的值,即返回x=2.
Notes:还有一点要注意的,如果你在finally里也用了return语句,比如return ++x。那么程序返回值会是3。因为规范规定了,当try和finally里都有return时,会忽略try的return,而使用finally的return。
结论:
当try语句中有return的时候,其与finally语句的执行情况。我们的得到的结论有:
- try中有return,finally一定会执行。
- try中有return, 会先将值暂存,无论finally语句中对该值做什么处理,最终返回的都是try语句中的暂存值。
- 当try与finally语句中均有return语句,会忽略try中return。