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

6

RuntimeException静态初始化程序引发,它发生在加载主类时。然后它被系统类加载器捕获,将它包装到一个ExceptionInInitializerError中,然后从 JVM 中退出。由于捕获了异常,因此永远不会调用默认的未捕获异常处理程序。

于 2014-12-29T21:43:41.677 回答
0

您的代码正在抛出IOException,而您catch的代码正在抛出IOException. 被IOException捕获并处理。IIRCUncaughtExceptionHandler唯一处理普通代码中未捕获的异常,而不是catch. 尝试临时更改您的catch以捕获其他异常,看看会发生什么。之后别忘了改回来!

于 2014-12-29T21:33:33.210 回答
0

您的代码位于静态块中。除非在非常罕见的 JVM 实现情况下(如果有的话),否则静态块不是您应该在可能的情况下处理任何错误或异常的地方。这是因为您对静态块的执行没有太多控制权(除非您有动态类加载器),这非常罕见。

因此,如果公平,请将您的代码移动到实例块,它应该可以正常工作。

因此,当您的静态块中发生意外情况时,您的应用程序预计不会继续。所以基本上,静态块中的所有意外异常都将由 ExceptionInIntiializerError 表示。你可以参考这里

于 2014-12-29T21:33:56.333 回答