日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java 中的finally 语句块执行顺序

發布時間:2025/1/21 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java 中的finally 语句块执行顺序 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

2019獨角獸企業重金招聘Python工程師標準>>>

參考博文1:https://www.ibm.com/developerworks/cn/java/j-lo-finally/

參考博文2:http://www.cnblogs.com/lanxuezaipiao/p/3440471.html


網上有很多人探討Java中異常捕獲機制try...catch...finally塊中的finally語句是不是一定會被執行?很多人都說不是,當然他們的回答是正確的,經過我試驗,至少有兩種情況下finally語句是不會被執行的:

(1)try語句沒有被執行到,如在try語句之前就返回了,這樣finally語句就不會執行,這也說明了finally語句被執行的必要而非充分條件是:相應的try語句一定被執行到。

(2)在try塊中有System.exit(0);這樣的語句,System.exit(0);是終止Java虛擬機JVM的,連JVM都停止了,所有都結束了,當然finally語句也不會被執行到。

1. finally語句在return語句執行之后return返回之前執行的。


當然還有很多人探討Finally語句的執行與return的關系,頗為讓人迷惑,不知道finally語句是在try的return之前執行還是之后執行?我也是一頭霧水,我覺得他們的說法都不正確,我覺得應該是:finally語句是在try的return語句執行之后,return返回之前執行

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語句已經執行了再去執行finally語句,不過并沒有直接返回,而是等finally語句執行完了再返回結果。

如果覺得這個例子還不足以說明這個情況的話,下面再加個例子加強證明結論:

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語句先執行了但并沒有立即返回,等到finally執行結束后再

這里大家可能會想:如果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中是否還有返回語句,這里還有個小細節需要注意,finally里加上return過后,finally外面的return b就變成不可到達語句了,也就是永遠不能被執行到,所以需要注釋掉否則編譯器報錯。

這里大家可能又想:如果finally里沒有return語句,但修改了b的值,那么try中return返回的是修改后的值還是原值?看下面。

3. 如果finally語句中沒有return語句覆蓋返回值,那么原來的返回值可能因為finally里的修改而改變也可能不變。


轉載于:https://my.oschina.net/u/2308739/blog/666488

總結

以上是生活随笔為你收集整理的java 中的finally 语句块执行顺序的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。