大多數公司針對初級、中級都會有筆試的這個環節,甚至很多高級面試也存在筆試環節。對於筆試大家千萬不要掉以輕心,筆試題做不好,很有可能面試就黃了或者隨便找個面試官應付一下就可以回去等通知了。
今天我們分享的這個面試題,出現的頻率是相當高。
案例
我們先上代碼:
運行上面這段代碼,輸出什麼?
是"蒼老師"還是"小澤"?
其實,對於java開發者來說,finally已經是老熟人了。
有時候,程序在try塊裡打開了一些物力資源(比如:資料庫連接,網絡連接、磁碟文件等),這些物力資源都是必須要我們手動回收。那就該它出場了---finally。
一個完整的java異常處理結構如下:
為了保證一定能回收try模塊中打開的物力資源,一場極致提供了finally模塊。不管try模塊中的代碼是否異常,也不管是哪一個catch被執行,甚至try或者catch模塊中執行了return語句,finally模塊總會被執行。
try、catch、finally三者的組合關係為:
在前面已經提到了,不管try裡是否有異常,不管try或者catch是否有return語句,finally裡的代碼塊會執行。
如果在try模塊沒有發生異常,那麼代碼正常執行完畢,在執行finally模塊。如果try模塊發生異常並且被catch模塊捕獲了,那麼在catch模塊內的代碼執行結束後再執行finally模塊。如果try模塊中有異常並且沒有catch模塊或者沒有被catch模塊捕獲到,那麼在異常被跑出去之前執行finally模塊。於是乎,很多人就認為答案是:小澤
運行代碼,輸出的居然是:蒼老師
是不是很懵逼?為什麼是「蒼老師」?
不著急,下面我們來好好分析分析。
我們先通過javac編譯,再通過javap命令查看看字節碼內容。內容如下:
整個過程
第一步:將"蒼老師"放入操作棧中,然後將操作數棧中的數據保存在本地變量1中,將本地變量1放入操作數棧中,然後將操作數棧中的數據保存在本地變量2中。
第二步:將「小澤」放入操作棧中,然後將操作數棧中的數據保存到本地變量1中。
第三步:將本地變量2放入操作數棧中,將操作數棧中的數據返回。
所以上面的面試題,最終返回的是蒼老師。
另外,如果在try模塊出現異常,那麼也是在finally模塊執行完了再向外面拋出異常的。
調用這個方法必然會出現異常:
從輸出日誌中可以看出,異常時在finally模塊後執行。
例外
如果我們在try模塊代碼中有下面這行代碼,finally模塊就不會執行了。
System.exit(0);
總結
本文講述了finally如何使用。以及哪些情況下finally模塊會執行,哪些情況下不會被執行,finally模塊和try模塊的關係。希望大家不管是在工作中還是面試都能輕鬆應對。
沒有學不好的技術,只有不愛學習的人~