try-multicatch与ExceptionInInitializerError和ArithmeticException混淆

时间:2016-08-03 06:50:03

标签: 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.println("Hello World");
     }
}

输出:

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) 

4 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

代码i=10/0会抛出ArithmeticException

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

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

答案 2 :(得分: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)     

答案 3 :(得分:0)

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

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