为什么要设置“sun.awt.exception.handler”属性呢?

时间:2011-04-26 18:00:51

标签: java swing awt uncaught-exception

这里有一些代码可以捕获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的异常处理程序?

2 个答案:

答案 0 :(得分:15)

EDT 类(java.awt.EventDispatchThread,不要在javadoc中查找,此类是包私有)自起源以来发生了很大变化AWT。

JDK6 中,您可以看到此类现在可以正确处理EDT内发生的异常。当前版本中的异常处理有点复杂:

  • 如果你已经设置了 sun.awt.exception.handler财产, 然后你的处理程序将被调用 开发人员抛出的每一个异常 在EDT内部调用的代码 (与以前的JDK兼容 确保版本。)
  • 否则,任何例外都将是 rethrown ,因此将停止当前的EDT,以及任何默认值 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)。)