1. 程式人生 > >【面試加分項】java異常處理之try_catch_finally

【面試加分項】java異常處理之try_catch_finally

try_catch_finally大家應該用的很多,不少人也瞭解一些他們的執行順序,可是它真的有這麼簡單麼,下面我們先來看一段程式碼,大家想想他的執行結果是什麼?

public class TestException {  
    int goabl=1;
    public TestException() {  
    }  

    int testEx() throws Exception {  
        int ret = 1;  
        try {  
            ret++; 
            return ret;
        } catch
(Exception e) { ret++; return ret; } finally { ret=0; } } int testEx1() throws Exception { int ret = 1; try { ret++; int t=ret/(ret-2);//製造一個exception return ret; } catch
(Exception e) { ret++; return ret; } finally { ret=0; } } int testEx2() throws Exception { int ret = 1; try { ret++; int t=ret/(ret-2);//製造一個exception return ret; } catch
(Exception e) { ret++; return ret; } finally { ret=0; return ret; } } int testEx3() throws Exception { int ret = 1; try { ret++; return ret; } catch (Exception e) { ret++; return ret; } finally { ret=0; return ret; } } int testEx4() throws Exception { try { goabl++; return goabl; } catch (Exception e) { goabl++; return goabl; } finally { goabl=0; } } public static void main(String[] args) { TestException testException1 = new TestException(); try { System.out.println(testException1.testEx()); System.out.println(testException1.testEx1()); System.out.println(testException1.testEx2()); System.out.println(testException1.testEx3()); System.out.println(testException1.testEx4()); System.out.println(goabl); } catch (Exception e) { e.printStackTrace(); } } }

好了現在公佈答案:
2
3
0
0
2
0
如果你的答案是正確的且知道是為什麼,那麼下面的內容相信你也不用看了。
首先這裡我就不細說java的異常處理機制,想了解的同學可以去看看java異常處理深入研究
我們首先對try_catch_finally的執行順序進行說明。
首先我可以很明確的告訴大家try_catch_finally的執行順序其實很簡單,首先是執行try中的 語句如果有異常就直接進入catch,最後finally一定會執行。
這樣可能有人會問那為什麼第一個的輸出不是0呢?別急我們來一個一個說明。

testEx

try語句中沒有任何異常所以catch不會執行。ret進行了一次++操作,這時程式進行了返回,在記憶體中會生成一個臨時變數,來儲存ret,也就是說ret的值賦給了一個臨時變數所以,ret在finally中賦值為零並不會改變返回的值所以輸出為2;

testEx1

這次我們人為的在try的語句中製造了exception這樣程式會進入到catch中,所以ret被++兩次,同樣finally中的語句不能對返回值產生影響,所以輸出為3;

testEx2

相對於testEx1我們在finally語句中加入了return語句,說以函式的返回值變成了0,這樣說名我能函式的返回值實在finally執行結束後才確定的。

testEx3

同testEx2一樣由於finally中加入了return語句,返回值為0;

testEx4

在這個函式中我們把操作的物件改為了全域性變數,結合最後一個輸出我們可以知道函式的返回結果的確是被一個臨時變數接收了,所以函式返回的結果是2,但是goabl已經變為0了。

好了這次就到這,覺得不錯的同學就幫我在下面點個讚唄,就在部落格的下方,點一下那個頂子就好,謝謝啦。