繁体   English   中英

java中的System.exit(0)

[英]System.exit(0) in java

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

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

  • 重用代码是一个障碍。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM