您的位置:首页 > 其它

关于finally是在return前还是后执行的一个测试

2009-04-15 16:49 531 查看
public class T{
private String expTest(){
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[]){
T t=new T();
System.out.println(t.expTest());
}
}


事实证明,是在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年后又搞懂了些。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐