这里有一些代码可以捕获Event Dispatch Thread上抛出的异常:
package com.ndh.swingjunk;
import java.awt.EventQueue;
import javax.swing.JFrame;
public class EntryPoint {
public static void main(String[] args) {
Thread.setDefaultUncaughtExceptionHandler(new MyExceptionHandler());
// System.setProperty("sun.awt.exception.handler", MyExceptionHandler.class.getName());
EventQueue.invokeLater(new Runnable()
{
public void run()
{
new SomeWindow("foo").setVisible(true);
}
});
}
}
class SomeWindow extends JFrame {
public SomeWindow(String title) {
this.setTitle(title);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
throw new RuntimeException("hello");
}
}
我已经看到警告,事件调度线程抛出的异常不会被UncaughtExceptionHandler处理,但我的例子似乎并非如此;无论注册行是注释掉还是遗留下来,它都是一样的。我的示例是以某种方式搞砸了,还是注册了不再需要sun.awt.exception.handler
的异常处理程序?
答案 0 :(得分:15)
EDT 类(java.awt.EventDispatchThread
,不要在javadoc中查找,此类是包私有)自起源以来发生了很大变化AWT。
在 JDK6 中,您可以看到此类现在可以正确处理EDT内发生的异常。当前版本中的异常处理有点复杂:
sun.awt.exception.handler
财产,
然后你的处理程序将被调用
开发人员抛出的每一个异常
在EDT内部调用的代码
(与以前的JDK兼容
确保版本。)UncaughtExceptionHandler
将是。{
能够抓住它,作为你的片段
演示。 但(这是非常重要),如果仔细查看EDT的代码,您会发现如果异常,此机制将无效发生模态对话框时,在EDT 中出现(我想这是因为EDT和EventQueue
管理相当复杂,我甚至敢说“凌乱” :很多代码看起来像黑客一样。)
在这种情况下,例外情况将记录到System.err
,除非您设置了sun.awt.exception.handler
属性。拥有默认UncaughtExceptionHandler
无济于事。
所以我对此的看法是,是的,你还应该打扰sun.awt.exception.handler
属性,除非你可以确定你的应用程序没有使用模态对话框(don)不要忘记JOptionPane
对话框也是模态的。)
答案 1 :(得分:2)
您已拨打setDefaultUncaughtExceptionHandler
而非setUncaughtExceptionHandler
。 (如果存在SecurityManager
:前者需要RuntimePermission setDefaultUncaughtExceptionHandler
;后者需要SecurityManager.checkAccess(Thread)
。)