java 中的finally 语句块执行顺序
2019獨角獸企業(yè)重金招聘Python工程師標準>>>
參考博文1:https://www.ibm.com/developerworks/cn/java/j-lo-finally/
參考博文2:http://www.cnblogs.com/lanxuezaipiao/p/3440471.html
網(wǎng)上有很多人探討Java中異常捕獲機制try...catch...finally塊中的finally語句是不是一定會被執(zhí)行?很多人都說不是,當然他們的回答是正確的,經(jīng)過我試驗,至少有兩種情況下finally語句是不會被執(zhí)行的:
(1)try語句沒有被執(zhí)行到,如在try語句之前就返回了,這樣finally語句就不會執(zhí)行,這也說明了finally語句被執(zhí)行的必要而非充分條件是:相應的try語句一定被執(zhí)行到。
(2)在try塊中有System.exit(0);這樣的語句,System.exit(0);是終止Java虛擬機JVM的,連JVM都停止了,所有都結束了,當然finally語句也不會被執(zhí)行到。
1. finally語句在return語句執(zhí)行之后return返回之前執(zhí)行的。
當然還有很多人探討Finally語句的執(zhí)行與return的關系,頗為讓人迷惑,不知道finally語句是在try的return之前執(zhí)行還是之后執(zhí)行?我也是一頭霧水,我覺得他們的說法都不正確,我覺得應該是:finally語句是在try的return語句執(zhí)行之后,return返回之前執(zhí)行。
public?class?FinallyTest1?{public?static?void?main(String[]?args)?{System.out.println(test1());}public?static?int?test1()?{int?b?=?20;try?{System.out.println("try?block");return?b?+=?80;?}catch?(Exception?e)?{System.out.println("catch?block");}finally?{System.out.println("finally?block");if?(b?>?25)?{System.out.println("b>25,?b?=?"?+?b);}}return?b;}} try?blockfinally?block b>25,?b?=?100 100說明return語句已經(jīng)執(zhí)行了再去執(zhí)行finally語句,不過并沒有直接返回,而是等finally語句執(zhí)行完了再返回結果。
如果覺得這個例子還不足以說明這個情況的話,下面再加個例子加強證明結論:
public?class?FinallyTest1?{public?static?void?main(String[]?args)?{System.out.println(test11());}public?static?String?test11()?{try?{System.out.println("try?block");return?test12();}?finally?{System.out.println("finally?block");}}public?static?String?test12()?{System.out.println("return?statement");return?"after?return";}}運行結果為:
try?blockreturn?statement finally?block after?return說明try中的return語句先執(zhí)行了但并沒有立即返回,等到finally執(zhí)行結束后再
這里大家可能會想:如果finally里也有return語句,那么是不是就直接返回了,try中的return就不能返回了?看下面。
2. finally塊中的return語句會覆蓋try塊中的return返回。
public?class?FinallyTest2?{public?static?void?main(String[]?args)?{System.out.println(test2());}public?static?int?test2()?{int?b?=?20;try?{System.out.println("try?block");return?b?+=?80;}?catch?(Exception?e)?{System.out.println("catch?block");}?finally?{System.out.println("finally?block");if?(b?>?25)?{System.out.println("b>25,?b?=?"?+?b);}return?200;}//?return?b;}}運行結果是:
try?blockfinally?block b>25,?b?=?100 200這說明finally里的return直接返回了,就不管try中是否還有返回語句,這里還有個小細節(jié)需要注意,finally里加上return過后,finally外面的return b就變成不可到達語句了,也就是永遠不能被執(zhí)行到,所以需要注釋掉否則編譯器報錯。
這里大家可能又想:如果finally里沒有return語句,但修改了b的值,那么try中return返回的是修改后的值還是原值?看下面。
3. 如果finally語句中沒有return語句覆蓋返回值,那么原來的返回值可能因為finally里的修改而改變也可能不變。
轉載于:https://my.oschina.net/u/2308739/blog/666488
總結
以上是生活随笔為你收集整理的java 中的finally 语句块执行顺序的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Oracle PL/SQL中如何使用%T
- 下一篇: 关于css3的自定义字体