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) 

이 코드에 실제 목적이 없습니다. 그러나 ArithmeticExceptionExceptionInInitializerError에 던진 이유가 궁금했습니다. 그냥 멀티 캐치 선언문을 시험해보고 이것에 부딪쳤다.

아래 코드는 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')가 먼저 발생합니다. catch하지 않으면 정적 초기화 완료시'ExceptionInInitializerError'로 래핑됩니다. 그러나 그것을 잡으면 즉시 정적 초기화 코드 _에 스택 추적을 인쇄합니다. 'ExceptionInInitializerError'를 얻었는지 더 자세히 살펴 보았습니까? –

답변

2
static 
{ 
    try 
    { 
     int i = 10/0; 
    } 
    catch (ExceptionInInitializerError | ArithmeticException e) 
    { 
     e.printStackTrace(); 
    } 
} 

이 제품은 ArithmeticException가 발생하지만, 당신이 그것을 잡을 수 있기 때문에, 초기화에 문제가 없습니다.

static 
{ 
    int i = 10/0; 
} 

이 제품은 ArithmeticException가 발생하지만, 당신이 그것을 잡을 수없는 때문에, ArithmeticExceptionExceptionInInitializerError됩니다. 아래 표시된 스택에서 볼 수 있습니다.

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이 throw됩니다. 첫 번째 스 니펫에서는 정적 초기화 블록에 아무런 오류가 없습니다. ArithmeticException10/0을 수행하려고 시도하지만 던져 지지만 초기화 블록 밖으로 전파되지 못해서 ExceptionInInitializerError이 생성되지 않습니다.

0

난/0 10 만 arithmeticexception이 발생 = 상태는, 그래서 당신의 시도 캐치는 arithmeticexception이 아니라있는 ExceptionInInitializerError를 잡는다.

try catch가없는 경우 기본적으로 예외 처리기에서 캐치됩니다.