gpt4 book ai didi

java - 为什么要设置 "sun.awt.exception.handler"属性呢?

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:33:56 24 4
gpt4 key购买 nike

下面是一些代码,用于捕获在事件调度线程上抛出的异常:

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 注册异常处理程序?

最佳答案

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

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

  • 如果你设置了sun.awt.exception.handler 属性,那么你的处理程序将被要求开发人员抛出的每个异常EDT 内部调用的代码(兼容之前的JDK确保版本)。
  • 否则,任何异常(exception)都会重新抛出,因此将停止当前的 EDT,以及任何默认值UncaughtExceptionHandler 将是能够捕获它,作为你的片段演示。

但是(这非常重要),如果你仔细看EDT的代码,你会发现如果异常发生在 EDT 同时显示模式对话框(我猜这是因为 EDT 和 EventQueue 管理相当复杂,我什至敢说“凌乱”:里面有很多代码看起来像是 hack)。

在这种情况下,异常将记录到 System.err,除非您设置了 sun.awt.exception.handler 属性。使用默认的 UncaughtExceptionHandler 将无济于事。

所以我对此的看法是,是的,您仍然应该为 sun.awt.exception.handler 属性而烦恼,除非您可以肯定地说您的应用程序不使用模态对话框(不要忘记 JOptionPane 对话框也是模态的)。

关于java - 为什么要设置 "sun.awt.exception.handler"属性呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5794472/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com