驯服Tiger: 线程中的默认异常处理 - 编程入门网
final int height) {
super(title);
EventQueue.invokeLater(new Runnable() {
public void run() {
setSize(width, height);
textArea = new JTextArea();
JScrollPane pane = new JScrollPane(textArea);
textArea.setEditable(false);
getContentPane().add(pane);
setVisible(true);
}
});
}
public void addLogInfo(final String data) {
EventQueue.invokeLater(new Runnable() {
public void run() {
textArea.append(data);
}
});
}
}
执行 清单 3 中的 WindowDump 程序将出现图 1 中的屏幕。因为没有从 Logger 中删除控制台处理程序,所以堆栈溢出仍将出现在控制台上。 图 1. 记录的堆栈跟踪 发生运行时异常时,可能要做许多工作来更改发生的问题。该代码的大部分都是 Logging Handler,但是,要执行更改,就必须细分 ThreadGroup ,重写 uncaughtException() ,然后在该线程组中执行您的线程。不过,让我们通过只安装 Thread.UncaughtExceptionHandler ,来看一看 Tiger 的处理方式。 驯服Tiger: 线程中的默认异常处理(4)时间:2011-01-31 John Zukowski使用 UncaughtExceptionHandler 的定制行为 对于 Tiger,Thread 类定义中添加了一个新的公共内部类 UncaughtExceptionHandler ,更完整的名称为 Thread.UncaughtExceptionHandler (其他类访问内部类时需要使用完整名称)。接口的定义是一个方法,如图 7 中所示: 清单 7. UncaughtExceptionHandler 的定义
您可能没有注意到,清单 7 中的方法与我们前面重写的 ThreadGroup 的方法相同。实际上,现在由 ThreadGroup 类实现该接口。 新的内部类可以帮助我们了解下列两对新方法,并有助于我们在 Thread 中使用它们: getUncaughtExceptionHandler() 和 setUncaughtExceptionHandler()。 getDefaultUncaughtExceptionHandler() 和 setDefaultUncaughtExceptionHandler()。 第一对方法是 getUncaughtExceptionHandler() 和 setUncaughtExceptionHandler() ,它们允许您为当前线程及其后代定制行为,从而允许二十或更多的线程拥有自己的定制行为。不过,您更可能使用第二对方法 getDefaultUncaughtExceptionHandler() 和 setDefaultUncaughtExceptionHandler() 。如果使用第二对方法设置默认处理程序,那么没有自己的异常处理程序的所有线程都将使用默认处理程序。 听起来好像很简单。为了进行说明,清单 8 转换了 清单 3 中的 ThreadGroup 友好的程序,使用新的 UncaughtExceptionHandler 接口: 清单 8. UncaughtExceptionHandler 示例
该程序只是将 LoggingThreadGroup 重用为 UncaughtExceptionHandler ,并没有创建新的处理程序实现。请注意,与原来的代码相比,新代码要简洁得多。 其他线程更改 Thread 类不仅支持使用 Tiger 添加的未捕获异常处理程序,它还支持使用 getAllStackTraces() 获得所有有效线程的堆栈跟踪,或者支持使用 getStackTrace() 来只获得当前线程的堆栈跟踪。这两种堆栈跟踪都返回类型为 java.lang.StackTraceElement 的对象,java.lan |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |