2016-08-13 14 views
2

:だからExceptionInInitializerErrorをキャッチすることは可能ですか?任意のThrowableが</p> <pre><code>class CatchThrowable { public static void main(String[] args){ try{ throw new Throwable(); } catch (Throwable t){ System.out.println("throwable caught!"); } } } </code></pre> <p>出力キャッチすることができ

throwable caught! 

を私は初期化ブロックの間に悪い何かをする場合、私はExceptionInInitializerErrorをキャッチできることを期待したいです。

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){} 
} 

出力:ただし、以下では動作しません

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

を、私はさらには、ArrayIndexOutOfBoundsException

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){} 
} 

をキャッチするためにコードを変更した場合には、引っ掛かりArrayIndexOutOfBoundsExceptionがあります:

ArrayIndexOutOfBoundsException caught! 

誰でも私にその理由を教えてもらえますか?

+0

'ExceptionInInitializerError'があなたの' try'ブロックの中にスローされていません。 'static'ブロックからキャッチされない例外がスローされたことが原因です。 – khelwood

答えて

3

その名前が示すように、ExceptionInInitializerErrorはエラーで、例外ではありません。例外とは異なり、errors are not meant to be caught。彼らは致命的な回復不可能な状態を示し、あなたのプログラムを止めることを意図しています。あなたのケースでは、それはArrayIndexOutOfBoundsExceptionだが、任意の例外は、このエラーが発生します -

ExceptionInInitializerErrorstatic変数の初期化子がキャッチされていない例外をスローしたことを示しています。静的初期化は実行中のプログラムのコンテキスト外で行われるため、例外を送信する場所はありません。そのため、Javaでは例外を生成するのではなく、エラーが生成されます。