【问题标题】:UncaughtExceptionHandler not catching exceptionUncaughtExceptionHandler 未捕获异常
【发布时间】:2014-12-29 21:07:22
【问题描述】:

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

【问题讨论】:

  • Statis 部分在 JVM 中特别受到威胁,因为这是类的初始部分,所以我认为它真的取决于 JDK 的实现。例如,我的 Oracle JDK 1.7.0_65 正确处理异常。
  • 可能是因为异常处理正确,即线程终止。除非您实际上是在主线程之外生成线程,否则我不会使用这种处理方式。

标签: java uncaughtexceptionhandler


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    您的代码抛出了一个IOException,而您的catch 捕获了一个IOExceptionIOException 被捕获和处理。 IIRC UncaughtExceptionHandler 仅处理正常代码中未捕获的异常,而不是 catch 中的异常。尝试暂时更改您的 catch 以捕获其他异常,看看会发生什么。之后别忘了改回来!

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-09-28
        • 2012-05-31
        • 1970-01-01
        相关资源
        最近更新 更多