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

Ausgang:Try-multicatch mit ExceptionInInitializerError und ArithmeticException Verwirrung

java.lang.ArithmeticException:/by zero                                                   
     at HelloWorld.<clinit>(HelloWorld.java:7) 

Es gibt keinen eigentlichen Zweck diesen Code. Aber nur gewundert, warum es ArithmeticException über ExceptionInInitializerError warf. Einfach Multi-Catch-Anweisung ausprobieren und lief darin.

Der folgende Code löst ExceptionInInitializerError aus. Logisch, wenn ich Try-Multicatch verwende, sollte es ExceptionInInitializerError fangen, aber das ist hier nicht der Fall. Kann mir hier jemand helfen?

public class HelloWorld { 

    static int i = 10/0; 

    public static void main(String []args){ 
     System.out.println("Hello World"); 
    } 
} 

Ausgang:

Exception in thread "main" java.lang.ExceptionInInitializerError                         
Caused by: java.lang.ArithmeticException:/by zero                             
     at HelloWorld.<clinit>(HelloWorld.java:4) 
+0

Als Vermutung wird zuerst die wirkliche Ausnahme ('ArithmeticException') geworfen. Wenn Sie es nicht abfangen, wird es beim Abschluss der statischen Initialisierung in 'ExceptionInInitializerError' gehüllt. Wenn Sie es jedoch fangen, drucken Sie sofort den Stack-Trace _while immer noch im statischen Initialisierungscode_. Haben Sie weiter unten nachgesehen, ob Sie dann 'ExceptionInInitializerError' erhalten haben? –

Antwort

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

Dies führt zu einem ArithmeticException aber da Sie es zu fangen, gibt es nicht Problem mit der Initialisierung.

static 
{ 
    int i = 10/0; 
} 

Dies führt zu einer ArithmeticException aber da Sie es nicht fangen, die ArithmeticException verursacht eine ExceptionInInitializerError. Sie können es von dem unten gezeigten Stapel sehen.

Exception in thread "main" java.lang.ExceptionInInitializerError 
Caused by: java.lang.ArithmeticException:/by zero 
    at src.Test.<clinit>(Test.java:23)  
2

Der Code i=10/0 wirft ein ArithmeticException.

Wenn Sie das ohne try-catch verwenden, gibt es nichts, was diese Ausnahme behandeln könnte. Eine nicht abgefangene Ausnahme während der Initialisierung verursacht ExceptionInInitializerError. Wie Sie sehen können, trägt der Fehler das Original ArithmeticException als Ursache.

Aber wenn Sie try-catch haben, dann haben Sie dieses Problem nicht mehr. Es gibt keine unbehandelte Ausnahme im Code - es wird von Ihrem Try-Catch behandelt. Daher sehen Sie die ursprüngliche Ausnahme, die den Fehler verursacht hätte.

3

Wenn ein statischer Initialisierer einer Klasse mit einer Ausnahme fehlschlägt, wird eine ExceptionInInitializerError, die die ursprüngliche Ausnahme umschließt, ausgelöst. In Ihrem ersten Snippet gibt es keinen Fehler im statischen Initialisierungsblock - derselbe ArithmeticException wird ausgelöst, indem versucht wird, 10/0 auszuführen, aber er wird abgefangen und darf nicht aus dem Initialisierungsblock übertragen werden, sodass keine ExceptionInInitializerError generiert wird.

0

Der Zustand i 10/0 = nur ArithmeticException wirft, fängt so Ihre try fangen die ArithmeticException nicht die ExceptionInInitializerError.

Wenn kein try catch vorhanden ist, wird es standardmäßig abgefangen.