Java:关闭我的应用程序,但有异常

时间:2012-08-21 14:02:10

标签: java exception

我想要一个可以从按钮中抛出异常的应用 然后该异常应该关闭应用程序(未处理的异常)。

(我需要检查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()来测试它 - 虽然它应该是相同的,但有时结果不一样)

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

3 个答案:

答案 0 :(得分:1)

检查这个答案: How do I catch this exception in Swing?

在执行uncaughtException时,请退出您的应用。

答案 1 :(得分:1)

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

在评论中解释here(Duncan Jones建议;)

  

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

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

答案 2 :(得分:0)

  

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

首先,从动作侦听器抛出异常将不起作用。它将终止Swing事件调度程序线程,但这不会使应用程序退出。

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

更好的解决方案是设计您的应用程序,以便在通过调用System.exit()来拔出插件之前尝试执行有序关闭。例如,一旦“主”线程启动了Swing调度程序事件线程,它就可以在一个告诉它关闭的条件下等待。 “退出”按钮的动作监听器将指示这种情况,主线程将唤醒并开始关闭。