java中的System.exit(0)

我正在使用swing编写应用程序。 我需要通过单击JButton退出应用程序,因为我可以使用System.exit()或者我应该使用其他方法,这是最佳实践。 如果调用System.exit()不是最佳实践,那么告诉原因并告诉退出应用程序的替代方法。

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

但是,在大多数情况下,像大多数开发人员一样,我依赖于System.exit(/ an exit code /) ,特别是对于Swing应用程序,其中Swing EDT将无休止地运行,就像justkt写的那样。这种方法的已知drawxback是大多数applciation代码都没有被调用,我通过调用Runtime.addShutdownHook(Thread)来设置一个关闭钩子,这将允许我清理应用程序(关闭线程,等等)。

通常,除了应用程序的“主要”方法之外的任何地方调用System.exit(...)可能会出现(至少)以下原因的问题。

  • 重用代码是一个障碍。

  • 它使unit testing变得困难。 例如,如果您的代码在JUnit测试执行一些error handling时调用System.exit ,那么它就是测试序列的结束!

在“退出”按钮的按钮侦听器中调用System.exit(...)的具体情况并不是那么糟糕。 您不太可能希望在不需要此行为的地方重用按钮侦听器。 此外,您可以找出unit testing难题的解决方法; 例如,不要对特定方法进行unit testing!

但是,我想我仍然会尝试以不同的方式退出。 例如,让main方法启动所有内容然后阻塞CountDownLatch,然后让按钮侦听器减少锁存器。 当main方法解除阻塞时,它会执行相关的关闭代码并根据需要返回或退出。

如果需要为应用程序设置退出代码,则必须使用System.exit(我认为)。

但是当你不需要特定的代码(或者0很好)时,我宁愿让JVM“自然地”终止,这在没有更多(非守护进程)线程时就会发生。

通常,您只需到达主方法的末尾即可。

我会小心使用System.exit,因为可能还有其他线程需要做某些事情,并且在没有正确关闭它们的情况下退出可能会造成损害。 例如,嵌入式数据库可能仍需要刷新其缓冲区。

如果您了解这些线程,通常可以安排它们优雅地结束。 如果你不知道你的程序中正在运行什么线程,你就会遇到更大的问题……

一般来说,您需要执行System.exit(n)的唯一时间是,如果要退出带有错误代码的命令行程序,以便监视程序的任何内容都可以检测到错误代码。

例如,如果您正在编写一个旨在从shell脚本运行的程序,那么这非常有用。

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

至少当你有多个线程或资源需要正确关闭(存在于JVM外部)时,System.exit可能会很糟糕。 如果您认为应用程序没有退出,那么您应该找出问题所在,而不仅仅是调用System.exit()。

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