1

我想要一个从按钮引发异常的应用程序。
然后异常应该关闭应用程序(未处理的异常)。

(我需要它来检查我的代码Runtime.getRuntime().addShutDownHook()

所以我写了这个

button1.addActionListener(new ActionListener() {
    @Override public void actionPerformed(ActionEvent e) {
        throw new NullPointerException("");
    }
});

并尝试也尝试抛出RuntimeException,但应用程序没有关闭。

有什么建议我如何因异常关闭我的应用程序?
谢谢。

编辑
我将解释 - 在 Java 文档中 - http://docs.oracle.com/javase/6/docs/api/java/lang/Runtime.html#addShutdownHook(java.lang.Thread)
注意到当你编写一个 JVM 关闭挂钩 - 使其成为快速运行的代码。引用:

“关闭钩子也应该快速完成它们的工作......”

我的代码运行时间更长,我想通过异常来测试它(而不是 System.exit() - 虽然它应该是相同的,但有时结果不一样)

只是想知道如何从按钮引发异常(我知道代码很糟糕,它是用于测试的)。

4

3 回答 3

1

您需要捕获异常并调用 System.exit()

评论中对此进行了解释(由 Duncan Jones 建议;)

setDefaultUncaughtExceptionHandler 仅在线程死亡时才起作用(线程由于未捕获的异常而突然终止)。但除非应用程序结束,否则 EventQueue 线程将永远不会死亡。因此,如果不进行特殊处理,所有未捕获的异常都将被 EventQueue 吞并并静默进入系统。

所以我会添加一个未捕获的异常处理程序来捕获其他线程何时死亡,但是要检查 EDT 中抛出的异常,您必须自己捕获它们。

于 2012-08-21T14:12:22.443 回答
1

检查这个答案: 如何在 Swing 中捕获此异常?

在执行 uncaughtException 时,只需退出您的应用程序。

于 2012-08-21T14:06:23.593 回答
0

任何建议如何由于异常而关闭我的应用程序?

首先,从动作监听器抛出异常是行不通的。它将杀死 Swing 事件调度程序线程,但这不会使应用程序退出。

简单的解决方案是System.exit(...)从侦听器调用以告诉 JVM 关闭。但是,如果这种方法有点“野蛮”并且可能导致异步执行的任务被放弃。您可以通过使用关闭挂钩来让任务摆脱困境来改善,但这仍然不是很好。例如,关闭挂钩不会以可预测的顺序触发......

更好的解决方案是将您的应用程序设计为在通过调用System.exit(). 例如,一旦“主”线程启动了 Swing 调度程序事件线程,它就可以等待一个告诉它关闭的条件。“退出”按钮的动作监听器会发出这种情况的信号,主线程会唤醒并开始关闭。

于 2012-08-21T14:16:06.327 回答