java中的System.exit(0)

时间:2010-04-16 07:03:48

标签: java swing

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

5 个答案:

答案 0 :(得分:11)

一般情况下,在应用程序的“主要”方法的任何地方调用System.exit(...)可能会出现问题(至少)以下原因。

  • 重用代码是一个障碍。

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

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

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

答案 1 :(得分:6)

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

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

答案 2 :(得分:3)

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

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

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

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

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

答案 3 :(得分:3)

一般来说,只有在需要执行System.exit(n)时才需要退出命令行程序并使用错误代码,以便监视程序的任何内容都可以检测到错误代码。

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

正如其他回复所说,如果您正在使用线程,那么在考虑使用System.exit(n)

之前,您必须尽一切努力将它们优雅地关闭。

答案 4 :(得分:2)

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

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