2016-08-13 1 views
2

kann ein beliebiger ThrowableKann ein ExceptionInInitializerError abgefangen werden?

class CatchThrowable {  
    public static void main(String[] args){ 
    try{ 
     throw new Throwable(); 
    } catch (Throwable t){ 
     System.out.println("throwable caught!"); 
    } 
    } 
} 

Ausgang gefangen werden:

throwable caught! 

Also, wenn ich etwas Schlimmes während eines Initialisierungsbaustein tun, würde ich einen ExceptionInInitializerError fangen zu können, erwarten. Allerdings ist die folgende nicht:

class InitError { 
    static int[] x = new int[4]; 
    static {               //static init block 
    try{ 
     x[4] = 5;              //bad array index! 
    } catch (ExceptionInInitializerError e) { 
     System.out.println("ExceptionInInitializerError caught!"); 
    } 
    }   
    public static void main(String[] args){} 
} 

Ausgang:

java.lang.ExceptionInInitializerError 
Caused by: java.lang.ArrayIndexOutOfBoundsException: 4 
    at InitError.<clinit>(InitError.java:13) 
Exception in thread "main" 

und wenn ich den Code ändern zusätzlich eine ArrayIndexOutOfBoundsException zu fangen

class InitError { 
    static int[] x = new int[4]; 
    static {               //static init block 
    try{ 
     x[4] = 5;              //bad array index! 
    } catch (ExceptionInInitializerError e) { 
     System.out.println("ExceptionInInitializerError caught!"); 
    } catch (ArrayIndexOutOfBoundsException e){ 
     System.out.println("ArrayIndexOutOfBoundsException caught!"); 
    } 
    }   
    public static void main(String[] args){} 
} 

es ist die ArrayIndexOutOfBoundsException, die gefangen wird:

ArrayIndexOutOfBoundsException caught! 

Kann mir jemand sagen, warum das ist?

+0

Der 'ExceptionInInitializerError' wird nicht in den' try' Block geworfen. Es wird von einer nicht abgefangenen Ausnahme verursacht, die aus Ihrem statischen Block geworfen wird. – khelwood

Antwort

3

Wie der Name andeutet, ist ExceptionInInitializerError ein Fehler, keine Ausnahme. Im Gegensatz zu Ausnahmen errors are not meant to be caught. Sie weisen auf schwerwiegende nicht behebbare Zustände hin und sollen Ihr Programm stoppen.

ExceptionInInitializerError zeigt an, dass ein Initialisierer einer static Variablen eine Ausnahme ausgelöst hat, die nicht abgefangen wurde - in Ihrem Fall ist es ArrayIndexOutOfBoundsException, aber jede Ausnahme verursacht diesen Fehler. Da die statische Initialisierung außerhalb des Kontext Ihres laufenden Programms stattfindet, gibt es keinen Ort, an dem die Ausnahme ausgelöst werden kann. Aus diesem Grund erzeugt Java einen Fehler, anstatt eine Ausnahme auszulösen.

Verwandte Themen