先来2个真理(或者说是1个):
1.无论什么情况,finally代码块中的语句都会执行
2.即使try或者catch中含有return语句,finally代码块中的语句依然会执行。
带着疑问进行:
return的意思是返回数据并退出,那么在这3个代码块中添加return会出现怎样的情况呢?执行顺序是怎样的呢?
首先,try和catch中的return肯定不会同时执行,那么当try或者catch中含有return,同时finally也含有return时,最终将执行哪一个return语句呢?
下面对try和finally同时含有return的情况进行测试。
输出结果:
可见,main方法输出的值是finally语句块的返回值,所以,当try中和finally同时有return语句时,最终会执行finally中的return。理论上执行完finally语句块会回到try中执行return,但是因为finally中的return让程序提前退出,因此导致了try中的return失效。当然,finally中不建议这么写,否则程序会提前退出。
情况总结:
情况1:try{} catch(){}finally{} return;
程序按顺序执行。
情况2: try{ return; }catch(){} finally{} return;
(1) 程序执行try块中return之前(包括return语句中的表达式运算)代码;
(2)执行finally块;(3)执行try中return;
(4)最后的语句return,但是程序在try中已经return所以不再执行。
情况3: try{ } catch(){return;} finally{} return;
(1)执行try代码块
有异常:(2)则执行catch中return之前(包括return语句中的表达式运算)代码;(3)执行finally语句块
(4)执行catch块中return.;(5)同上末尾的return不再执行。
无异常:(2)finally语句块(3)执行末尾的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语句中的表达式运算)代码;
(3)执行finally块,因为finally块中有return所以提前退出。
无异常:(2)执行finally块,因为finally块中有return所以提前退出。