官术网_书友最值得收藏!

1.19 finally塊中的代碼什么時候被執(zhí)行

問題描述:try{}里有一個return語句,那么緊跟在這個try后的finally{}里的code會不會被執(zhí)行?什么時候被執(zhí)行?在return前還是后?

在Java語言的異常處理中,finally語句塊的作用就是保證無論出現(xiàn)什么情況,finally塊里的代碼一定會被執(zhí)行。由于當(dāng)程序執(zhí)行return的時候就意味著結(jié)束對當(dāng)前方法的調(diào)用并跳出這個方法體,任何語句要執(zhí)行都只能在return前執(zhí)行(除非碰到exit函數(shù)),因此finally塊里的代碼也是在return前執(zhí)行的。此外,如果try-finally或者catch-finally中都有return,則finally塊中的return語句將會覆蓋別處的return語句,最終返回到調(diào)用者的是finally中return的值。下面通過一個例子(示例1)來說明這個問題:

程序運行結(jié)果為:

從上面這個例子中可以看出,在執(zhí)行return前確實執(zhí)行了finally中的代碼。緊接著,在finally塊里面放置return語句,例子(示例2)如下所示:

程序運行結(jié)果為:

從以上運行結(jié)果可以看出,當(dāng)finally塊中有return語句時,將會覆蓋函數(shù)中其他return語句。此外,由于在一個方法內(nèi)部定義的變量都存儲在棧中,當(dāng)這個函數(shù)結(jié)束后,其對應(yīng)的棧就會被回收,此時在其方法體中定義的變量將不存在了,因此return在返回的時候不是直接返回變量的值,而是復(fù)制一份,然后返回。因此,對于基本類型的數(shù)據(jù),在finally塊中改變return的值對返回值沒有任何影響,而對于引用類型的數(shù)據(jù),就有影響。下面通過一個例子(示例3)來說明這個問題:

程序運行結(jié)果為:

程序在執(zhí)行到return的時候會首先將返回值存儲在一個指定的位置,然后去執(zhí)行finally代碼塊,然后再返回。在方法testFinally1中調(diào)用return前首先把result的值1存儲在一個指定的位置,然后再去執(zhí)行finally塊中的代碼,此時修改result的值將不會影響到程序的返回結(jié)果。testFinally2中,在調(diào)用return前首先把s存儲到一個指定的位置,由于s為引用類型,因此在finally塊中修改s將會修改程序的返回結(jié)果。

引申:出現(xiàn)在Java程序中的finally代碼塊是不是一定會執(zhí)行?

不一定會執(zhí)行,下面給出兩個finally代碼塊不會執(zhí)行的例子。

1)當(dāng)程序在進入try語句塊之前就出現(xiàn)異常的時候,會直接結(jié)束,不會執(zhí)行finally塊中的代碼。如下例所示:

程序運行結(jié)果為:

程序在執(zhí)行int i=5/0的時候會拋出異常,導(dǎo)致沒有執(zhí)行try塊,因此finally塊也就不會被執(zhí)行。

2)當(dāng)程序在try塊中強制退出的時候也不會去執(zhí)行finally塊中的代碼,如下例所示:

程序運行結(jié)果為:

上例在try塊中通過調(diào)用System.exit(0)強制退出了程序,因此導(dǎo)致finally塊中的代碼沒有被執(zhí)行。

主站蜘蛛池模板: 南宁市| 仁怀市| 克拉玛依市| 文安县| 安溪县| 阳东县| 云霄县| 科尔| 麦盖提县| 乐陵市| 赤壁市| 含山县| 霸州市| 阿合奇县| 中山市| 探索| 文昌市| 高青县| 霍林郭勒市| 肃北| 宣威市| 佛冈县| 宁晋县| 青铜峡市| 新龙县| 太湖县| 阿勒泰市| 稻城县| 新昌县| 五峰| 城市| 正阳县| 额尔古纳市| 青神县| 集贤县| 潍坊市| 文昌市| 宝兴县| 桐梓县| 湖北省| 溆浦县|