在 finally 中不应该出现跳转语句
1,为什么不能在finally 中设置 return语句?
如果try/catch的语句块有跳转语句,finally语句块先行。
因为在执行的过程中,如果在try/catch中看到跳转语句,会将finally中的语句块前置,先执行,然后再去执行原try/catch中的跳转语句。
破坏了逻辑,异常的传递被截断了,这样就导致一些未被捕获的异常不会发现,即使程序出现问题,
https://blog.csdn.net/zhanggonglalala/article/details/103668513
2.具体情况
情况1:try{}catch(){}finally{} return;显然程序会按顺序执行。
情况2: try{ return; }catch(){} finally{} return;
程序执行try块中return之前(包括return语句中的表达式运算)代码;再执行finally块,最后执行try中return;finally块之后的语句return,因为程序在try中已经return所以不再执行。
情况3: try{ } catch(){return;} finally{} return;
程序先执行try,如果遇到异常执行catch块,有异常:则执行catch中return之前(包括return语句中的表达式运算)代码,再执行finally语句中全部代码,最后执行catch块中return. finally之后的代码不再执行。无异常:执行完try再finally再return.
情况4: try{ return; }catch(){} finally{return;}
程序执行try块中return之前(包括return语句中的表达式运算)代码;再执行finally块,因为finally块中有return所以提前退出。
情况5: try{} catch(){return;}finally{return;}
程序执行catch块中return之前(包括return语句中的表达式运算)代码;再执行finally块,因为finally块中有return所以提前退出。
情况6: try{ return;}catch(){return;} finally{return;}
程序执行try块中return之前(包括return语句中的表达式运算)代码;有异常:执行catch块中return之前(包括return语句中的表达式运算)代码;则再执行finally块,因为finally块中有return所以提前退出。无异常:则再执行finally块,因为finally块中有return所以提前退出。
3. 最终结论
任何执行try 或者catch中的return语句之前,都会先执行finally语句,如果finally存在的话。如果finally中有return语句,那么程序就return了,所以finally中的return是一定会被return的,编译器把finally中的return实现为一个warning。