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 时,它会被异常处理程序默认捕获。
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 时,它会被异常处理程序默认捕获。