大多數公司針對初級、中級都會有筆試的這個環節,甚至不少高級面試也存在筆試環節。對於筆試你們千萬不要掉以輕心,筆試題作很差,頗有可能面試就黃了或者隨便找個面試官應付一下就能夠回去等通知了。java
今天咱們分享的這個面試題,出現的頻率是至關高。面試
咱們先上代碼:數據庫
public class TryFinallyDemo {
public static void main(String[] args) {
TryFinallyDemo tryFinallyDemo = new TryFinallyDemo();
System.out.println(tryFinallyDemo.test());
}
public String test() {
String name = "蒼老師";
try {
return name;
} finally {
name = "小澤";
}
}
}
運行上面這段代碼,輸出什麼?網絡
是"蒼老師"仍是"小澤"?ide
其實,對於java開發者來講,finally已是老熟人了。學習
有時候,程序在try塊裏打開了一些物力資源(好比:數據庫鏈接,網絡鏈接、磁盤文件等),這些物力資源都是必需要咱們手動回收。url
那就該它出場了---finally。spa
一個完整的java異常處理結構以下:3d
public void test(){
try{
//業務代碼
}catch(SubException e1){
//異常處理模塊1
}catch(SubException e2){
//異常處理模塊1
}finally{
//資源回收模塊
}
}
爲了保證必定能回收try模塊中打開的物力資源,一場極致提供了finally模塊。無論try模塊中的代碼是否異常,也無論是哪個catch被執行,甚至try或者catch模塊中執行了return語句,finally模塊總會被執行。日誌
try、catch、finally三者的組合關係爲:
在前面已經提到了,無論try裏是否有異常,無論try或者catch是否有return語句,finally裏的代碼塊會執行。
異常相關推薦這篇文章:
因而乎,不少人就認爲答案是:小澤
運行代碼,輸出的竟然是:蒼老師
是否是很懵逼?爲何是「蒼老師」?
不着急,下面咱們來好好分析分析。
咱們先經過javac編譯,再經過javap命令查看看字節碼內容。內容以下:
第一步:將"蒼老師"放入操做棧中,而後將操做數棧中的數據保存在本地變量1中,將本地變量1放入操做數棧中,而後將操做數棧中的數據保存在本地變量2中。
第二步:將「小澤」放入操做棧中,而後將操做數棧中的數據保存到本地變量1中。
第三步:將本地變量2放入操做數棧中,將操做數棧中的數據返回。
因此上面的面試題,最終返回的是蒼老師。
另外,若是在try模塊出現異常,那麼也是在finally模塊執行完了再向外面拋出異常的。
public String test() {
String name = "蒼老師";
try {
int a = 1/0;
return name;
} finally {
System.out.println("finally");
name = "小澤";
}
}
調用這個方法必然會出現異常:
從輸出日誌中能夠看出,異常時在finally模塊後執行。
例外
若是咱們在try模塊代碼中有下面這行代碼,finally模塊就不會執行了。
System.exit(0);
本文講述了finally如何使用。以及哪些狀況下finally模塊會執行,哪些狀況下不會被執行,finally模塊和try模塊的關係。但願你們無論是在工做中仍是面試都能輕鬆應對。
沒有學很差的技術,只有不愛學習的人~