问题:
1.finally中的语句是否一定会被执行?
答案是否定的,有以下两种情况。
1.在进入try语句之间就已经发生异常
2.在try中强制退出,System.exit(0)(终止java虚拟机)
2.finally中的return语句究竟是在try中的return语句之前还是之后执行?
答案是finally语句是在return语句执行之后,return返回之前执行的。
3.如果try和finally中都有return语句,最终返回哪一个?
答案是finally中的return。
举例:
情况1:
try{} catch(){}finally{} return;
按顺序执行。
情况2:
try{ return; }catch(){} finally{} return;
1.程序执行try块中return之前(包括return语句中的表达式运算)代码;
2.执行finally块,最后执行try中return;
注:finally块之后的语句return,因为程序在try中已经return所以不再执行。
情况3:
try{ } catch(){return;} finally{} return;
1.程序先执行try,如果遇到异常执行catch块,
2.有异常:则执行catch中return之前(包括return语句中的表达式运算)代码,再执行finally语句中全部代码,最后执行catch块中return.
finally之后的代码不再执行。
3.无异常:执行完try再finally再return.
情况4:
try{ return; }catch(){} finally{return;}
1.程序执行try块中return之前(包括return语句中的表达式运算)代码;
2.再执行finally块,因为finally块中有return所以提前退出。
情况5:
try{} catch(){return;}finally{return;}
1.程序执行catch块中return之前(包括return语句中的表达式运算)代码;
2.再执行finally块,因为finally块中有return所以提前退出。
情况6:
try{ return;}catch(){return;} finally{return;}
1.程序执行try块中return之前(包括return语句中的表达式运算)代码;
2.有异常:执行catch块中return之前(包括return语句中的表达式运算)代码;
则再执行finally块,因为finally块中有return所以提前退出。
3.无异常:则再执行finally块,因为finally块中有return所以提前退出。
最终结论:
任何执行try 或者catch中的return语句之前,都会先执行finally语句,如果finally存在的话。
如果finally中有return语句,那么程序就return了,所以finally中的return是一定会被return的,
编译器把finally中的return实现为一个warning。