【问题标题】:Java: closing my app with an exceptionJava:异常关闭我的应用程序
【发布时间】:2012-08-21 14:02:10
【问题描述】:

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

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

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

【问题讨论】:

  • 你需要捕获异常并调用System.exit()
  • @PeterLawrey, System.exit(1)
  • 这不是关闭应用程序的正确方法。看这个帖子stackoverflow.com/questions/258099/…
  • @PeterLawrey 将其作为答案,您将获得支持。
  • 你为什么还要抛出异常?单击按钮时不能直接调用System.exit() 吗?

标签: java exception


【解决方案1】:

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

在执行 uncaughtException 时,只需退出您的应用即可。

【讨论】:

  • 如果异常发生在事件调度线程上,我不确定这是否有效(请参阅我在原始问题中的评论)。我认为这种方法仅适用于未捕获的异常杀死有问题的线程,而事件调度线程自动重新启动的情况。
  • @DuncanJones 我同意,看我的回答。
  • 对不起,我不明白你的意思。如果 EDT 上存在未捕获的异常,则 EDT 将终止并启动新的异常。在这种情况下会触发 DefaultUncaughtException 并且一切都按描述进行。问候
【解决方案2】:

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

在 cmets 中解释了 here(由 Duncan Jones 建议;)

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

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

【讨论】:

  • 偷我的风头你为什么不;-)
【解决方案3】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 2016-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-13
    • 2010-09-08
    • 1970-01-01
    • 1970-01-01
    • 2011-03-21
    相关资源
    最近更新 更多