事实证明,是在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年后又搞懂了些。