我正在使用swing编写应用程序。我需要通过单击JButton
退出应用程序,因为我可以使用System.exit()
或者我应该使用其他方法,这是最佳做法。如果调用System.exit()
不是最佳做法,那么告诉原因并告诉退出应用程序的替代方法。
答案 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()的唯一原因是给出一些没有标准的退出代码。