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

输出:

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

此代码没有实际用途。但只是想知道它为什么会ArithmeticException摔倒ExceptionInInitializerError。只是尝试了 multi-catch 语句并遇到了这个问题。

下面的代码抛出ExceptionInInitializerError. 所以从逻辑上讲,如果我使用 try-multicatch,它应该 catch 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

4 回答 4

3

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

于 2016-08-03T06:53:43.367 回答
2

代码i=10/0抛出一个ArithmeticException.

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

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

于 2016-08-03T06:53:39.177 回答
2
static
{
    try
    {
        int i = 10 / 0;
    }
    catch (ExceptionInInitializerError | ArithmeticException e)
    {
        e.printStackTrace();
    }
}

这会导致ArithmeticException但由于您捕获它,因此初始化没有问题。

static
{
    int i = 10 / 0;
}

这会导致 anArithmeticException但由于您没有抓住它,因此ArithmeticException会导致ExceptionInInitializerError. 您可以从下面显示的堆栈中看到它。

Exception in thread "main" java.lang.ExceptionInInitializerError
Caused by: java.lang.ArithmeticException: / by zero
    at src.Test.<clinit>(Test.java:23)     
于 2016-08-03T06:54:35.630 回答
0

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

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

于 2016-08-03T06:55:33.827 回答