未从嵌套线程调用默认 UncaughtExceptionHandler
Default UncaughtExceptionHandler not being called from nested thread
我通读了几个示例,了解如何使用 UncaughtExceptionHandler
将异常从嵌套线程传递到 parent 线程。目前,我的嵌套线程的 UncaughtExceptionHandler
可以捕获异常。我已将其设置为将异常传递给 parent 线程的默认 UncaughtExceptionHandler.uncaughtException(...)
方法。
public void load() {
// Create the nested thread
final Thread loadingThread = new Thread(new Runnable() {
@Override
public void run() {
// Do stuff... throw an exception at some point
throw new RuntimeException("Something has gone horribly wrong!");
}
}
});
// Set up a custom exception handler for the nested thread
class LoadingThreadExceptionHandler implements UncaughtExceptionHandler {
// The parent exception handler
private UncaughtExceptionHandler defaultHandler;
// Constructor to get a handle on the parent's exception handler
public void LoadingThreadExceptionHandler() {
// Check if the parent thread has an exception handler
if (Thread.getDefaultUncaughtExceptionHandler() == null) {
System.out.println("The default handler is null");
}
// Get the parent's default exception handler
defaultHandler = Thread.getDefaultUncaughtExceptionHandler();
return;
}
@Override
public void uncaughtException(Thread t, Throwable e) {
System.out.prinln("This is the nested thread's handler");
// Pass it onto the parent's default exception handler
defaultHandler.uncaughtException(t, e);
}
};
// Set the custom exception handler on the loadingThread
loadingThread.setUncaughtExceptionHandler(new LoadingThreadExceptionHandler());
// Start the thread
loadingThread.start();
return;
}
运行 这会产生以下输出:
This is the nested thread's handler
无论出于何种原因,调用了嵌套的 UncaughtExceptionHandler
,但它似乎没有将异常传递给 parent 线程的默认 UncaughtExceptionHandler
,因为在那之后没有任何反应.我曾一度怀疑 parent 的默认值 UncaughtExceptionHandler
可能是空的,所以我在构造函数中添加了一些逻辑来检查它并打印一条消息,但这似乎永远不会案子。我也尝试过覆盖 parent 的默认异常处理程序,但无济于事。
我是不是漏掉了什么?我无法理解为什么 parent 的 uncaughtException(...)
方法似乎从未被调用过。
public void LoadingThreadExceptionHandler()
这没有被调用,因为它不是构造函数。当您调用 new LoadingThreadExceptionHandler()
时,将调用无参数默认构造函数(如果不存在构造函数,则由编译器创建)。
要修复它,它应该没有 return 类型:
public LoadingThreadExceptionHandler()
我通读了几个示例,了解如何使用 UncaughtExceptionHandler
将异常从嵌套线程传递到 parent 线程。目前,我的嵌套线程的 UncaughtExceptionHandler
可以捕获异常。我已将其设置为将异常传递给 parent 线程的默认 UncaughtExceptionHandler.uncaughtException(...)
方法。
public void load() {
// Create the nested thread
final Thread loadingThread = new Thread(new Runnable() {
@Override
public void run() {
// Do stuff... throw an exception at some point
throw new RuntimeException("Something has gone horribly wrong!");
}
}
});
// Set up a custom exception handler for the nested thread
class LoadingThreadExceptionHandler implements UncaughtExceptionHandler {
// The parent exception handler
private UncaughtExceptionHandler defaultHandler;
// Constructor to get a handle on the parent's exception handler
public void LoadingThreadExceptionHandler() {
// Check if the parent thread has an exception handler
if (Thread.getDefaultUncaughtExceptionHandler() == null) {
System.out.println("The default handler is null");
}
// Get the parent's default exception handler
defaultHandler = Thread.getDefaultUncaughtExceptionHandler();
return;
}
@Override
public void uncaughtException(Thread t, Throwable e) {
System.out.prinln("This is the nested thread's handler");
// Pass it onto the parent's default exception handler
defaultHandler.uncaughtException(t, e);
}
};
// Set the custom exception handler on the loadingThread
loadingThread.setUncaughtExceptionHandler(new LoadingThreadExceptionHandler());
// Start the thread
loadingThread.start();
return;
}
运行 这会产生以下输出:
This is the nested thread's handler
无论出于何种原因,调用了嵌套的 UncaughtExceptionHandler
,但它似乎没有将异常传递给 parent 线程的默认 UncaughtExceptionHandler
,因为在那之后没有任何反应.我曾一度怀疑 parent 的默认值 UncaughtExceptionHandler
可能是空的,所以我在构造函数中添加了一些逻辑来检查它并打印一条消息,但这似乎永远不会案子。我也尝试过覆盖 parent 的默认异常处理程序,但无济于事。
我是不是漏掉了什么?我无法理解为什么 parent 的 uncaughtException(...)
方法似乎从未被调用过。
public void LoadingThreadExceptionHandler()
这没有被调用,因为它不是构造函数。当您调用 new LoadingThreadExceptionHandler()
时,将调用无参数默认构造函数(如果不存在构造函数,则由编译器创建)。
要修复它,它应该没有 return 类型:
public LoadingThreadExceptionHandler()