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

出力:

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

このコードには実際の目的はありません。しかし、なぜそれが倒れたのか疑問に思いArithmeticExceptionましたExceptionInInitializerError。multi-catch ステートメントを試してみて、これに遭遇しました。

以下のコードは をスローし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) 
4

4 に答える 4

3

クラスの静的初期化子が例外で失敗するとExceptionInInitializerError、元の例外をラップする がスローされます。最初のスニペットでは、静的初期化ブロックに失敗はありません。ArithmeticException実行しようとすると同じことがスローされます10/0が、キャッチされ、初期化ブロックからの伝播が許可されないため、noExceptionInInitializerErrorが生成されます。

于 2016-08-03T06:53:43.367 に答える
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)     
于 2016-08-03T06:54:35.630 に答える
2

コードi=10/0ArithmeticException.

それを try-catch なしで使用すると、その例外を処理するものは何もありません。初期化中に捕捉されなかった例外により、ExceptionInInitializerError. ご覧のとおり、エラーのArithmeticException原因はオリジナルにあります。

しかし、あなたが持っているときtry-catch、あなたはもはやこの問題を抱えていません. コードには未処理の例外はありません。それは try-catch によって処理されます。したがって、エラーの原因となった元の例外が表示されます。

于 2016-08-03T06:53:39.177 に答える
0

状態 i=10/0 は ArithmeticException のみをスローするため、try catch は ExceptionInInitializerError ではなく ArithmeticException をキャッチします。

try catch がない場合、デフォルトの例外ハンドラーによってキャッチされます。

于 2016-08-03T06:55:33.827 に答える