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。

当没有尝试捕获时它被默认捕获异常处理程序。