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)
答案 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处理程序捕获。