try-multicatch 与 ExceptionInInitializerError 和 ArithmeticException 混淆

try-multicatch with ExceptionInInitializerError and ArithmeticException confusion

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");
     }
}

输出:

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

此代码没有实际用途。但只是想知道为什么它把 ArithmeticException 放在 ExceptionInInitializerError 之上。 只是尝试将 multi-catch 语句和 运行 放入其中。

下面的代码抛出 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) 

代码 i=10/0 抛出 ArithmeticException

当你在没有 try-catch 的情况下使用它时,将无法处理该异常。初始化时未捕获的异常导致 ExceptionInInitializerError。如您所见,错误以原始 ArithmeticException 作为其原因。

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

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

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)     

状态 i=10/0 仅抛出 ArithmeticException ,因此您的 try catch 捕获 ArithmeticException 而不是 ExceptionInInitializerError。

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