2
public class HelloWorld { 
    static { 
    try { 
     int i=10/0; 
    } catch(ExceptionInInitializerError | ArithmeticException e) { 
      e.printStackTrace(); 
    } 
    } 

    public static void main(String []args) { 
     System.out.println("Hello World"); 
    } 
} 

輸出:試穿multicatch用的ExceptionInInitializerError和ArithmeticException混亂

java.lang.ArithmeticException:/by zero                                                   
     at HelloWorld.<clinit>(HelloWorld.java:7) 

沒有實際的目的,這個代碼。但只是想知道爲什麼它拋出ArithmeticException超過ExceptionInInitializerError。 只是嘗試多捕獲的聲明,並遇到此問題。

下面的代碼會拋出ExceptionInInitializerError。因此,邏輯上,如果我使用try-multicatch,它應該捕獲ExceptionInInitializerError,但在這裏不是這種情況。有人可以幫我從這裏出去嗎。

public class HelloWorld { 

    static int i = 10/0; 

    public static void main(String []args){ 
     System.out.println("Hello World"); 
    } 
} 

輸出:

Exception in thread "main" java.lang.ExceptionInInitializerError                         
Caused by: java.lang.ArithmeticException:/by zero                             
     at HelloWorld.<clinit>(HelloWorld.java:4) 
+0

作爲一個猜測,真正的異常('ArithmeticException')首先被拋出。當你沒有捕獲它時,在靜態初始化完成時它會被封裝在'ExceptionInInitializerError'中。但是,如果你捕獲它,你立即打印堆棧跟蹤_仍然在靜態初始化code_中。你有沒有進一步看看你是否得到了'ExceptionInInitializerError'? –

回答

2
static 
{ 
    try 
    { 
     int i = 10/0; 
    } 
    catch (ExceptionInInitializerError | ArithmeticException e) 
    { 
     e.printStackTrace(); 
    } 
} 

這導致ArithmeticException但因爲你抓住它,沒有與初始化問題。

static 
{ 
    int i = 10/0; 
} 

這導致ArithmeticException但因爲你不抓住它,在ArithmeticException導致ExceptionInInitializerError。您可以從下面顯示的堆棧中看到它。

Exception in thread "main" java.lang.ExceptionInInitializerError 
Caused by: java.lang.ArithmeticException:/by zero 
    at src.Test.<clinit>(Test.java:23)  
2

代碼i=10/0拋出ArithmeticException

當您在沒有try-catch的情況下使用它時,沒有任何東西可以處理該異常。初始化時未捕獲的異常會導致ExceptionInInitializerError。正如你所看到的,這個錯誤帶來了原來的ArithmeticException

但是,當你有try-catch,那麼你不再有這個問題。代碼中沒有未處理的異常 - 它由try-catch處理。因此,您會看到會導致錯誤的原始異常。

3

當某個類的靜態初始化程序發生異常時失敗,將引發包裝原始異常的ExceptionInInitializerError。在您的第一個片段中,靜態初始化塊中沒有失敗 - 嘗試執行10/0時會拋出相同的ArithmeticException,但它被捕獲且不允許傳播出初始化塊,因此不會生成ExceptionInInitializerError

0

I = 10/0只拋出ArithmeticException狀態,所以你嘗試捕捉捕捉ArithmeticException不是的ExceptionInInitializerError。

當沒有嘗試捕獲時它被默認捕獲異常處理程序。