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

Выход:примерки multicatch с ExceptionInInitializerError и ArithmeticException спутанность

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

Как предполагают, первое исключение ('ArithmeticException') выбрано первым. Когда вы его не поймаете, он завершается в 'ExceptionInInitializerError' при завершении статической инициализации. Если, однако, вы его поймаете, вы сразу же распечатываете трассировку стека _while еще в статическом коде инициализации. Вы посмотрели дальше, чтобы узнать, есть ли у вас «ExceptionInInitializerError»? –

ответ

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)  
2

Код i=10/0ArithmeticException бросает.

Когда вы используете это без try-catch, тогда нечего обрабатывать это исключение. Неперехваченное исключение при инициализации вызывает ExceptionInInitializerError. Как вы можете видеть, ошибка несет в себе оригинал ArithmeticException.

Но когда у вас есть try-catch, у вас больше не будет этой проблемы. В коде отсутствует необработанное исключение - он обрабатывается вашим try-catch. Таким образом, вы видите исходное исключение, вызвавшее ошибку.

3

Когда статический инициализатор класса выходит из строя с исключением, генерируется ExceptionInInitializerError, который обертывает исходное исключение. В вашем первом фрагменте нет отказа в статическом блоке инициализации - тот же самый ArithmeticException бросается, пытаясь выполнить 10/0, но он пойман и не разрешен для распространения из блока инициализации, поэтому не создается ExceptionInInitializerError.

0

состояние я = 10/0 броски только ArithmeticException, так что ваша попытка поймать ловит ArithmeticException не ExceptionInInitializerError.

если нет попытки поймать пойман по умолчанию Exception обработчик.

Смежные вопросы