Java 未从嵌套线程调用默认UncaughtExceptionHandler
我已经阅读了几个示例,介绍了如何使用Java 未从嵌套线程调用默认UncaughtExceptionHandler,java,multithreading,uncaughtexceptionhandler,Java,Multithreading,Uncaughtexceptionhandler,我已经阅读了几个示例,介绍了如何使用UncaughtExceptionHandler将异常从嵌套线程传递到父线程。目前,我的嵌套线程的UncaughtExceptionHandler会捕获它应该捕获的异常。我已将其设置为将异常传递给父线程的默认UncaughtExceptionHandler.uncaughtException(…)方法 public void load() { // Create the nested thread final Thread loadingTh
UncaughtExceptionHandler
将异常从嵌套线程传递到父线程。目前,我的嵌套线程的UncaughtExceptionHandler
会捕获它应该捕获的异常。我已将其设置为将异常传递给父线程的默认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;
}
运行此命令将生成以下输出:
这是嵌套线程的处理程序
无论出于何种原因,都会调用嵌套的UncaughtExceptionHandler
,但它似乎不会将异常传递给父线程的默认UncaughtExceptionHandler
,因为在该点之后不会发生任何事情。我曾一度怀疑父级的默认UncaughtExceptionHandler
为空,因此,我在构造函数中添加了一些逻辑来检查这一点并打印一条消息,但事实似乎并非如此。我还尝试重写父级的默认异常处理程序,尽管没有效果
我是不是遗漏了什么?我无法理解为什么父级的uncaughtException(…)
方法似乎从未被调用
public void LoadingThreadExceptionHandler()
没有调用它,因为它不是构造函数。调用new LoadingThreadExceptionHandler()
时,将调用无参数默认构造函数(如果不存在构造函数,则由编译器创建)
要修复它,它应该没有返回类型:
public LoadingThreadExceptionHandler()
你希望得到什么样的输出?哇,我真不敢相信我犯了这么一个基本的错误!删除返回类型确实使其工作。谢谢大家!@安娜:我很高兴能帮上忙。我认为大多数IDE都会显示一条警告,指出方法名与类名相同。