System.exit(0) in java

10

我正在使用swing编写一个应用程序,需要通过单击JButton退出应用程序。我可以使用System.exit()吗?还是应该使用其他方法,哪种方法是最佳实践。如果调用System.exit()不是最佳实践,请说明原因并告诉我退出应用程序的替代方法。

您可以使用System.exit()退出应用程序,但这不是建议的最佳实践。这是因为该方法将强制终止应用程序的所有线程,并可能导致数据丢失或损坏。相反,建议您使用WindowEvent.WINDOW_CLOSING来关闭应用程序窗口,如下所示:


JFrame frame = new JFrame("My Application");
frame.addWindowListener(new WindowAdapter() {
    public void windowClosing(WindowEvent e) {
        System.exit(0);
    }
});
5个回答

11

一般情况下,除了在应用程序的“main”方法中调用System.exit(...)外,在任何地方调用该方法都可能存在以下问题:

  • 它会阻碍代码的重复使用。

  • 它会使单元测试变得困难。例如,如果您的代码在 JUnit 测试执行某些错误处理时调用 System.exit,那么测试序列就此结束!

在“退出”按钮的按钮监听器中调用System.exit(...)的特定情况并不那么糟糕。您不太可能希望在其他需要此行为的位置重复使用按钮监听器。此外,您可以想出解决单元测试难题的方法;例如,不对该特定方法进行单元测试!

然而,我认为我仍然会尝试以不同的方式退出。例如,让main方法启动所有内容并在 CountDownLatch 上阻塞,然后让按钮监听器递减该计数器。当main方法解除阻塞时,它将执行相关的关闭代码并根据需要返回或退出。


6

个人而言,我认为让应用程序自行退出是最佳实践:如果你编写一个带有 main(String[] args) 的主类,其中代码为空,运行它将从Java程序中静默退出。

但是,在大多数情况下,像大多数开发人员一样,我依赖于 System.exit(/退出代码/),特别是对于Swing应用程序,在那里Swing EDT将无休止地运行,正如justkt所写的那样。这种方法已知的缺点是大部分应用程序代码不会被调用,我通过调用 Runtime.addShutdownHook(Thread) 设置一个关闭挂钩来避免这种情况,这将使我能够清理应用程序(关闭线程等)。


1
让应用程序自行退出对于非GUI应用程序有效,但是对于Swing,您有事件队列和事件线程,您无法控制,如果没有某种形式(编程或单击JFrame上的“x”)的用户干预,它将不会关闭。 - justkt
System.exit 与 shutdown hooks 结合在许多我所参与的大型项目中都有出现。请确保不要从 shutdown hook 线程调用 System.exit - https://knotgillcup.blogspot.com/2019/08/systemexit-not-working.html - KnotGillCup

3

如果您需要为应用程序设置退出代码,则必须使用System.exit(我想是这样的)。

但是,当您不需要特定的代码(或0可行)时,我更希望JVM“自然”终止,这发生在没有更多(非守护线程)线程时。

通常,您只需到达主方法的结尾。

我会小心使用System.exit,因为可能还有其他线程需要执行某些操作,而没有正确关闭它们就退出可能会造成损坏。例如,嵌入式数据库可能仍然需要刷新其缓冲区。

如果您了解这些线程,通常可以安排它们优雅地结束。如果您不知道程序中运行哪些线程,则存在更大的问题...


如果主方法抛出异常,Java 将生成另一个退出代码(如果我记得正确的话是 130)。 - whiskeysierra

3

通常情况下,只有在想要用错误代码退出命令行程序以便监控程序可以检测到错误代码时才需要使用 System.exit(n)。

例如,如果您正在编写一个设计用于从 shell 脚本运行的程序,则此功能最为有用。

但正如其他回复所说,如果您正在使用线程,则必须尽一切努力在考虑 System.exit(n) 之前优雅地关闭它们。


2

当你有多个线程或需要在JVM之外正确关闭的资源时,System.exit可能会产生问题。如果您的应用程序没有在您认为应该退出时退出,则应查找问题而不仅仅调用System.exit()。

唯一调用System.exit()的原因是给出一些非标准的退出代码。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接