try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后?
try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后?
很多人都说是在return前执行,但我的写的测试程序确得到不同答案?有没有高手讲讲啊
public String message(){
System.out.println("returned");
return "123";
}
public String testFinal(){
try{
return message();
}catch(Exception e){
e.printStackTrace();
return "exception";
}finally{
System.out.println("do finally");
}
}
public static void main(String[] args){
Test test = new Test();
test.testFinal();
}
------解决方案--------------------
finally是一定会执行的
只有代码中有system.exit() 这一种情况 才不会执行finally
因为终止了虚拟机进程
finally会在return之前执行
如果在finally里面有return情况会更复杂
------解决方案--------------------
------解决方案--------------------先调用message()函数,但此时还不会return,执行finally{}完后,就只剩下return了,return执行就跳出该函数。你可以设断点,按F6
debug下,可以清楚看到。
------解决方案--------------------finally的代码会在return前执行.
------解决方案--------------------会执行
在 try 中 或 catch 中遇到 return 就会转入 finally
------解决方案--------------------
------解决方案--------------------先执行return,后执行finally中的代码
------解决方案--------------------看看这个
http://topic.csdn.net/t/20041211/20/3636856.html
理解一下什么是--------return-----------
------解决方案--------------------还有这个
http://blog.csdn.net/gaoyuanfeng/archive/2009/04/11/4064388.aspx
------解决方案--------------------先查资料,再去思考,最后再上来给出答案
请别人云亦云,误导别人
------解决方案--------------------public String message(){
System.out.println("returned");
return "123"; ---- 2
}
public String testFinal(){
try{
return message(); ---- 1
}catch(Exception e){
e.printStackTrace();
return "exception";
}finally{
System.out.println("do finally"); --- 3
}
}
public static void main(String[] args){
Test test = new Test();
test.testFinal();
}
感觉结果应该是:
returned
do finally
------解决方案--------------------根据java规范:在try-catch-finally中,如果try-finally或者catch-finally中都有return,则两个return语句都执行并且最终
返回到调用者那里的是finally中return的值;而如果finally中没有return,则理所当然的返回的是try或者catch中return的值,但是
finally中的代码是必须要执行的,而且是在return前执行,除非碰到exit()。
------解决方案--------------------你可以断点跟踪下不就知道了
------解决方案--------------------Java code
public String message(){
System.out.println("returned");
return "123"; ---- 2
}
public String testFinal(){
try{
return message(); ---- 1
}catch(Exception e){
e.printStackTrace();
return "exception";
}finally{
System.out.println("do finally"); --- 3
}
}
public static void main(String[] args){
Test test = new Test();
test.testFinal();
}
土匪说的很对 finally 确实在return 前执行 在我标注的 2 的return 前执行