Java 尝试使用ExceptionInInitializerError和算术异常混淆的multicatch

Java 尝试使用ExceptionInInitializerError和算术异常混淆的multicatch,java,try-catch,static-initialization,arithmeticexception,Java,Try Catch,Static Initialization,Arithmeticexception,输出: public class HelloWorld { static { try { int i=10/0; } catch(ExceptionInInitializerError | ArithmeticException e ) { e.printStackTrace(); } } public static void main(String []args) { System.out

输出:

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");
     }
}
public class HelloWorld {

     static int i = 10/0;

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

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");
     }
}
public class HelloWorld {

     static int i = 10/0;

     public static void main(String []args){
        System.out.println("Hello World");
     }
}
线程“main”java.lang.ExceptionInInitializeError中的异常 原因:java.lang.arithmetricException:/by zero 在HelloWorld。(HelloWorld.java:4)
代码
i=10/0
抛出一个
算术异常

当您在没有try-catch的情况下使用它时,就没有什么可以处理该异常。初始化时未捕获的异常会导致异常InInitializeError。正如您所看到的,错误携带原始的
算术异常作为其原因


但是当您有了
try catch
,您就不再有这个问题了。代码中没有未处理的异常-它由try-catch处理。因此,您将看到可能导致错误的原始异常。

当类的静态初始值设定项因异常而失败时,将抛出一个封装原始异常的
ExceptionInInitializeError
。在您的第一个代码段中,静态初始化块中没有失败-尝试执行
10/0
时抛出相同的
算术异常
,但它被捕获并且不允许传播出初始化块,因此不会生成
异常InInitializeRerror

Exception in thread "main" java.lang.ExceptionInInitializerError                                                                                                   
Caused by: java.lang.ArithmeticException: / by zero                                                                                                                
        at HelloWorld.<clinit>(HelloWorld.java:4) 
这会导致一个
算术异常
,但由于您捕获了它,所以初始化没有问题

static
{
    try
    {
        int i = 10 / 0;
    }
    catch (ExceptionInInitializerError | ArithmeticException e)
    {
        e.printStackTrace();
    }
}
这会导致一个
算术异常
,但由于您没有捕获它,
算术异常
会导致一个
异常InInitializerError
。您可以从下面显示的堆栈中看到它

static
{
    int i = 10 / 0;
}
线程“main”java.lang.ExceptionInInitializeError中的异常 原因:java.lang.arithmetricException:/by zero Test.(Test.java:23)
状态i=10/0只抛出算术异常,因此try-catch捕获的是算术异常,而不是ExceptionInInitializerError


当没有try-catch时,默认异常处理程序会捕获它。

作为猜测,首先抛出真正的异常(
arithmetricexception
)。当您没有捕捉到它时,它会在静态初始化完成时被包装在
exceptionininitializerror
中。但是,如果您确实捕获了它,那么您将在静态初始化代码中立即打印堆栈跟踪。您是否进一步向下查看是否得到了
异常InInitializeRerror