try catch finally執(zhí)行順序面試題總結(jié)

轉(zhuǎn)自:https://www.cnblogs.com/superFish2016/p/6687549.html
在網(wǎng)上看到一些異常處理的面試題仪或,試著總結(jié)一下,先看下面代碼蒸苇,把這個方法在main中進(jìn)行調(diào)用打印返回結(jié)果蓉冈,看看結(jié)果輸出什么瞳别。

public static  int testBasic(){
        int i = 1; 
        try{
            i++;
            System.out.println("try block, i = "+i);
        }catch(Exception e){
            i++;
            System.out.println("catch block i = "+i);
        }finally{
            i = 10;
            System.out.println("finally block i = "+i);
        }
        return i;
}

沒錯,會按照順序執(zhí)行壹蔓,先執(zhí)行try內(nèi)代碼段趟妥,沒有異常的話進(jìn)入finally,最后返回庶溶,那么輸出如下:

try block, i = 2
finally block i = 10
main test i = 10

這個沒有問題煮纵,如果我們把return語句放入try catch里又會怎么樣呢

public static  int testBasic(){
        int i = 1; 
        try{
            i++;
            System.out.println("try block, i = "+i);
            return i;
        }catch(Exception e){
            i++;
            System.out.println("catch block i = "+i);
            return i;
        }finally{
            i = 10;
            System.out.println("finally block i = "+i);
        }
}

輸出結(jié)果是:

try block, i = 2
finally block i = 10
main test i = 2

代碼順序執(zhí)行從try到finally懂鸵,由于finally是無論如何都會執(zhí)行的,所以try里的語句并不會直接返回行疏。在try語句的return塊中匆光,return返回的引用變量并不是try語句外定義的引用變量i,而是系統(tǒng)重新定義了一個局部引用i’,這個引用指向了引用i對應(yīng)的值酿联,也就是2终息,即使在finally語句中把引用i指向了值10,因為return返回的引用已經(jīng)不是i,而是i',所以引用i的值和try語句中的返回值無關(guān)了贞让。

但是周崭,這只是一部分,如果把i換成包裝類型而不是基本類型呢喳张,來看看輸出結(jié)果怎樣续镇,示例如下:

public static  List<Object> testWrap(){
        List<Object> list = new ArrayList<>();
        try{
            list.add("try");
            System.out.println("try block");
            return list;
        }catch(Exception e){
            list.add("catch");
            System.out.println("catch block");
            return list;
        }finally{
            list.add("finally");
            System.out.println("finally block ");
        }
}

打印結(jié)果如下:

try block
finally block 
main test i = [try, finally]

可以看到,finally里對list集合的操作生效了销部,這是為什么呢摸航。我們知道基本類型在棧中存儲,而對于非基本類型是存儲在堆中的舅桩,返回的是堆中的地址酱虎,因此內(nèi)容被改變了。

好了擂涛,現(xiàn)在我們在finally里加一個return读串,看看語句是從哪里返回的。

public static  int testBasic(){
        int i = 1; 
        try{
            i++;
            System.out.println("try block, i = "+i);
            return i;
        }catch(Exception e){
            i ++;
            System.out.println("catch block i = "+i);
            return i;
        }finally{
            i = 10;
            System.out.println("finally block i = "+i);
            return i;
        }
}

輸出結(jié)果如下:

try block, i = 2
finally block i = 10
main test i = 10

可以看到撒妈,是從finally語句塊中返回的恢暖。可見踩身,JVM是忽略了try中的return語句胀茵。但I(xiàn)DE中會對finally中加的return有黃色警告提示,這是為什么呢挟阻,在try里加入一行會執(zhí)行異常的代碼琼娘,如下:

public static  int testBasic(){
        int i = 1; 
        try{
            i++;
            int m = i / 0 ;
            System.out.println("try block, i = "+i);
            return i;
        }catch(Exception e){
            i ++;
            System.out.println("catch block i = "+i);
            return i;
        }finally{
            i = 10;
            System.out.println("finally block i = "+i);
            return i;
        }
}

打印結(jié)果如下:

catch block i = 3
finally block i = 10
main test i = 10

可以看到,因為finally中有return語句附鸽,try脱拼、catch中的異常被消化掉了,屏蔽了異常的發(fā)生坷备,這與初期使用try熄浓、catch的初衷是相違背的,因此編譯器也會提示警告。

那如果在finally中有異常發(fā)生赌蔑,會對try俯在、catch中的異常有什么影響呢?

public static  int testBasic(){
        int i = 1; 
        try{
            i++;
            Integer.parseInt(null);
            System.out.println("try block, i = "+i);
            return i;
        }catch(Exception e){
            String.valueOf(null);
            System.out.println("catch block i = "+i);
            return i;
        }finally{
            i = 10;
            int m = i / 0;
            System.out.println("finally block i = "+i);
        }
}

這里我們在try娃惯、catch里強(qiáng)行加上異常語句跷乐,打印結(jié)果如下:

Exception in thread "main" java.lang.ArithmeticException: / by zero
at tryandcatch.TryAndCatch.testBasic(TryAndCatch.java:25)
at tryandcatch.TryAndCatch.main(TryAndCatch.java:45)

這個提示表示的是finally里的異常信息,也就是說一旦finally里發(fā)生異常趾浅,try愕提、catch里的異常信息即被消化掉了,也達(dá)不到異常信息處理的目的皿哨。
總結(jié)以上測試:
1浅侨、finally語句總會執(zhí)行
2、如果try证膨、catch中有return語句如输,finally中沒有return,那么在finally中修改除包裝類型和靜態(tài)變量椎例、全局變量以外的數(shù)據(jù)都不會對try挨决、catch中返回的變量有任何的影響(包裝類型、靜態(tài)變量會改變订歪、全局變量)
3、盡量不要在finally中使用return語句肆捕,如果使用的話刷晋,會忽略try、catch中的返回語句慎陵,也會忽略try眼虱、catch中的異常,屏蔽了錯誤的發(fā)生
4席纽、finally中避免再次拋出異常捏悬,一旦finally中發(fā)生異常,代碼執(zhí)行將會拋出finally中的異常信息润梯,try过牙、catch中的異常將被忽略
所以在實際項目中,finally常常是用來關(guān)閉流或者數(shù)據(jù)庫資源的纺铭,并不額外做其它操作寇钉。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市舶赔,隨后出現(xiàn)的幾起案子扫倡,更是在濱河造成了極大的恐慌,老刑警劉巖竟纳,帶你破解...
    沈念sama閱讀 221,635評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件撵溃,死亡現(xiàn)場離奇詭異疚鲤,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)缘挑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評論 3 399
  • 文/潘曉璐 我一進(jìn)店門石咬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人卖哎,你說我怎么就攤上這事鬼悠。” “怎么了亏娜?”我有些...
    開封第一講書人閱讀 168,083評論 0 360
  • 文/不壞的土叔 我叫張陵焕窝,是天一觀的道長。 經(jīng)常有香客問我维贺,道長它掂,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,640評論 1 296
  • 正文 為了忘掉前任溯泣,我火速辦了婚禮虐秋,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘垃沦。我一直安慰自己客给,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,640評論 6 397
  • 文/花漫 我一把揭開白布肢簿。 她就那樣靜靜地躺著靶剑,像睡著了一般。 火紅的嫁衣襯著肌膚如雪池充。 梳的紋絲不亂的頭發(fā)上桩引,一...
    開封第一講書人閱讀 52,262評論 1 308
  • 那天,我揣著相機(jī)與錄音收夸,去河邊找鬼坑匠。 笑死,一個胖子當(dāng)著我的面吹牛卧惜,可吹牛的內(nèi)容都是我干的厘灼。 我是一名探鬼主播,決...
    沈念sama閱讀 40,833評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼序苏,長吁一口氣:“原來是場噩夢啊……” “哼手幢!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起忱详,我...
    開封第一講書人閱讀 39,736評論 0 276
  • 序言:老撾萬榮一對情侶失蹤围来,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體监透,經(jīng)...
    沈念sama閱讀 46,280評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡桶错,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,369評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了胀蛮。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片院刁。...
    茶點(diǎn)故事閱讀 40,503評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖粪狼,靈堂內(nèi)的尸體忽然破棺而出退腥,到底是詐尸還是另有隱情,我是刑警寧澤再榄,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布狡刘,位于F島的核電站,受9級特大地震影響困鸥,放射性物質(zhì)發(fā)生泄漏嗅蔬。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,870評論 3 333
  • 文/蒙蒙 一疾就、第九天 我趴在偏房一處隱蔽的房頂上張望澜术。 院中可真熱鬧,春花似錦猬腰、人聲如沸鸟废。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽侮攀。三九已至,卻和暖如春厢拭,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背撇叁。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評論 1 272
  • 我被黑心中介騙來泰國打工供鸠, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人陨闹。 一個月前我還...
    沈念sama閱讀 48,909評論 3 376
  • 正文 我出身青樓楞捂,卻偏偏與公主長得像,于是被迫代替她去往敵國和親趋厉。 傳聞我的和親對象是個殘疾皇子寨闹,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,512評論 2 359

推薦閱讀更多精彩內(nèi)容