UncaughtExceptionHandler没有捕获异常

时间:2014-12-29 21:07:22

标签: java uncaughtexceptionhandler

我不确定为什么没有调用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

3 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:0)

您的代码正在抛出IOException,而您的catch抓住了IOExceptionIOException被捕获并处理。 IIRC UncaughtExceptionHandler仅处理普通代码中未捕获的异常,而不是来自catch。尝试暂时更改catch以捕获其他异常,看看会发生什么。不要忘记之后再改回来!

答案 2 :(得分:0)

您的代码处于静态阻止状态。除非极少见JVM实现(如果有),否则静态块不是您应该处理任何错误或异常的地方。这是因为你对静态块的执行没有那么多的控制(除非你有动态类加载器),这是非常罕见的。

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

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