2016-07-04 133 views
2

我有一個實踐問題,下面的代碼:爲什麼此異常不會導致運行時錯誤?

public class Test { 

    static String s = ""; 

    public static void m0(int a, int b) { 
     s += a; 
     m2(); 
     m1(b); 
    } 

    public static void m1(int i) { 
     s += i; 
    } 

    public static void m2() { 
     throw new NullPointerException("aa"); 
    } 

    public static void m() { 
     m0(1, 2); 
     m1(3); 
    } 

    public static void main(String args[]) { 
     try { 
      m(); 
     } catch (Exception e) { 
     } 
     System.out.println(s); 
    } 
} 

在方法2,當拋出NullPointerException異常,爲何不終止線程如我所料?我認爲在同一個方法中沒有try catch塊,它會導致異常並暫停程序。

據我瞭解,它已經恢復到先前調用的方法,M0,當我想拋出的異常會暫停該計劃。最終的結果是程序打印1,作爲s的值。

一切我已閱讀到目前爲止有關例外並不能解釋這個邏輯,我不能工作了我自己,所以我希望我能得到一些幫助!提前致謝。

+0

沒有你嘗試調試? – AdamSkywalker

+5

異常會一直冒泡,直到它們被捕獲或從執行堆棧頂部冒泡。這意味着'main()'中的'catch'會捕獲並執行任何操作,因爲catch塊是空的。把一些輸出在那裏(例如'的System.out.println(「嘿,我抓到的東西」);',然後再試一次 –

+0

@AdamSkywalker耶剛剛試了一下,它與編譯和運行沒有問題,它只是打印1 – Sam

回答

3

NullPointerException被拋出時,爲什麼它不像我想象的那樣終止線程?

因爲線程不會終止,除非異常遍歷調用鏈。

我以爲在同一個方法中沒有try catch塊,它會導致異常並暫停程序。

它不是一樣的方法,它在調用鏈中的任何方法 - 在這種情況下,main捕獲異常,防止線程終止。

2

您正在追趕你的主要方法例外。您的版本只是忽略它,版本下方將打印例外...

public static void main(String args[]) { 
    try { 
     m(); 
    } catch (Exception e) { 
     System.out.println("You are catching: " + e); 
    } 
    System.out.println(s); 
} 

如果你想在程序終止,不要捕獲異常,如下面的例子:

public static void main(String args[]) { 
    m(); 
    // never reached 
    System.out.println(s); 
} 
相關問題