5

uncaughtException メソッドが呼び出されない理由がわかりません。

static
{
    /**
     * Register a logger for unhandled exceptions.
     */
    Thread.UncaughtExceptionHandler globalExceptionHandler = new Thread.UncaughtExceptionHandler()
    {
        @Override
        public void uncaughtException(Thread t, Throwable e)
        {
            System.out.println("handle exception."); // can also set bp here that is not hit.
        }
    };

    Thread.setDefaultUncaughtExceptionHandler(globalExceptionHandler);
    Thread.currentThread().setUncaughtExceptionHandler(globalExceptionHandler);

    /**
     * Register gateway listen port.
     */
    try
    {
       // some stuff that raises an IOException
    }
    catch (IOException e)
    {
        System.out.println("Throwing exception");
        throw new RuntimeException(e);
    }

}

プログラムの出力は次のとおりです。

例外のスロー

java.lang.ExceptionInInitializerError
Caused by: java.lang.RuntimeException: java.io.FileNotFoundException: blah.jks 
    (The system cannot find the file specified)
...some stack trace...
Exception in thread "main" 
Process finished with exit code 1
4

3 に答える 3

0

あなたのコードは をスローしてIOExceptionおり、あなたはcatchをキャッチしていIOExceptionます。IOExceptionをキャッチして処理します。IIRC は、UncaughtExceptionHandlera 内からではなく、通常のコード内からのキャッチされていない例外のみを扱いますcatch。一時的に変更してcatch他の例外をキャッチし、何が起こるかを確認してください。後で元に戻すことを忘れないでください。

于 2014-12-29T21:33:33.210 に答える
0

あなたのコードは静的ブロックにあります。JVM 実装の非常にまれなケース (存在する場合) を除き、静的ブロックは、可能であればエラーや例外を処理する場所ではありません。これは、静的ブロックの実行をそれほど制御できないためです (動的クラスローダーを使用しない限り)。これは非常にまれです。

したがって、公平であれば、コードをインスタンス ブロックに移動すると、正常に動作するはずです。

そのため、静的ブロックで予期しないことが発生した場合、アプリケーションは続行されないことが予想されます。したがって、基本的に、静的ブロック内のこれらの予期しない例外はすべて、ExceptionInIntiializerError によって表されます。ここで参照できます

于 2014-12-29T21:33:56.333 に答える