- Java程序員面試筆試寶典(第2版)
- 何昊等編著
- 910字
- 2022-06-17 16:00:50
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í)行。
- 工程軟件開發(fā)技術(shù)基礎(chǔ)
- vSphere High Performance Cookbook
- Backbone.js Blueprints
- 重學(xué)Java設(shè)計模式
- JavaScript:Moving to ES2015
- 大數(shù)據(jù)分析與應(yīng)用實戰(zhàn):統(tǒng)計機器學(xué)習(xí)之?dāng)?shù)據(jù)導(dǎo)向編程
- Lighttpd源碼分析
- Create React App 2 Quick Start Guide
- SQL Server數(shù)據(jù)庫管理與開發(fā)兵書
- 51單片機C語言開發(fā)教程
- C++反匯編與逆向分析技術(shù)揭秘(第2版)
- 人工智能算法(卷1):基礎(chǔ)算法
- Training Systems Using Python Statistical Modeling
- Python Projects for Kids
- 百萬在線:大型游戲服務(wù)端開發(fā)