我有一个突然死在我身上的线程。
线程主循环如:
while (true) {
try {
<snip>
} catch (InterruptedException e) {
e.printStackTrace();
} catch (Throwable e) {
e.printStackTrace();
}
}
我开始就像:
thread.setUncaughtExceptionHandler((thread, throwable) -> {
throwable.printStackTrace();
});
我有一个非常可重复的情况,程序停止工作,当我调用Eclipse调试器时,这个线程无处可见。
如何发生这种情况以及如何跟踪它,我原以为我的代码会捕获线程可以退出的所有可能方式,并且我会得到正在发生的事情的堆栈跟踪......。
答案 0 :(得分:2)
尝试使用try / finally块在最高级别包装尽可能多的代码。除非调用System.exit(),否则应始终在代码退出块时捕获。
正如您所发现的,代码可能会以静默方式丢弃的一种方式是,如果您使用return;
而没有意识到这一点。
您未捕获的异常处理程序仅处理未捕获的异常。在这种情况下,您似乎捕获了所有异常。
当您有未捕获的异常时调用的方法在Thread中。
/**
* Dispatch an uncaught exception to the handler. This method is
* intended to be called only by the JVM.
*/
private void dispatchUncaughtException(Throwable e) {
getUncaughtExceptionHandler().uncaughtException(this, e);
}