事实证明,是在return前执行了finally语句块,所以清华出版的那书错了~~
2014-3-5 11:04:50 补充
public class Test3 extends Date {
public String tryFinally() {
// int x = 1;
StringBuffer buf = new StringBuffer();
try {
System.out.println("try");
// return x;
buf.append("try");
return buf.toString();
} catch (Exception e) {
System.out.println("catch");
// return x;
buf.append("catch");
return buf.toString();
} finally {
System.out.println("finally");
// ++x;
buf.append("finally");
// return buf.toString();
}
}
public String tryFinally2() {
try{
throw new Exception("Exception Test");
}catch(Exception e){
System.out.println(e.getMessage());
return "end catch..";
}finally{
System.out.println("finally block..");
return "end finally..";//这句注释的话,就执行catch里的return
}
}
public static void main(String[] args) {
Test3 test = new Test3();
System.out.println("tryFinally: " + test.tryFinally());
System.out.println("tryFinally2: " + test.tryFinally2());
}
}结果
try
finally
tryFinally: try
Exception Test
finally block..
tryFinally2: end finally..
finally语句块一定会执行,且在return前。而try或catch语句块中的return语句运行结果,似乎存储一个在函数return结果的快照中,后面执行的finally语句块(非return语句)的执行不会影响这个结果快照。但是如果finally语句有return语句时,return结果快照则被finally语句块中的return语句执行结果更新,从而函数返回结果又以finally语句块的return语句执行结果为准。ok,没想到5年后又搞懂了些。
本文通过两个具体的Java示例,详细解析了try-catch-finally语句块中的return语句执行顺序及影响。证实了finally块会在return之前执行,并且如果finally中有return,则会覆盖之前的返回值。
3186

被折叠的 条评论
为什么被折叠?



