我不确定为什么没有调用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
答案 0 :(得分:5)
从静态初始值设定项中引发RuntimeException
,它会在您的主类加载时发生。然后由系统类加载器 捕获 ,将其包装到ExceptionInInitializerError
中,然后从JVM退出。由于捕获了异常,因此永远不会调用默认的未捕获异常处理程序。
答案 1 :(得分:0)
您的代码正在抛出IOException
,而您的catch
抓住了IOException
。 IOException
被捕获并处理。 IIRC UncaughtExceptionHandler
仅处理普通代码中未捕获的异常,而不是来自catch
。尝试暂时更改catch
以捕获其他异常,看看会发生什么。不要忘记之后再改回来!
答案 2 :(得分:0)
您的代码处于静态阻止状态。除非极少见JVM实现(如果有),否则静态块不是您应该处理任何错误或异常的地方。这是因为你对静态块的执行没有那么多的控制(除非你有动态类加载器),这是非常罕见的。
因此,如果它是公平的,请将您的代码移动到实例块,它应该可以正常工作。
因此,当您的静态块发生意外情况时,您的应用程序预计不会继续。 基本上,静态块中的所有意外异常都将由ExceptionInIntiializerError表示。 您可以参考here