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
?