java - 如何正确关闭 java 命令行程序

标签 java findbugs

我有一个交互式 java 程序,允许用户将消息发送到服务器,它的行为有点像 shell,接受用户的键盘输入并执行各种操作。

例如

myProgram> send "Login as James" to server

我的程序将解析用户输入并执行操作,在这种情况下,它将向服务器发送消息“以 James 身份登录”。

我支持它的“退出”命令之一,它将关闭所有服务器连接,清理资源并关闭应用程序。处理这个退出命令的代码是

private void shutdown()
{
  closeAllConnection();
  cleanup();
  System.out.println("Thank you for using the tool, have a nice day!");
  System.exit(0);
}

当我对我的代码运行 findbug 时,出现了一个 DM_EXIT 错误

Bug: new myProgram.messagingTools.main(String[]) invokes System.exit(...), which shuts down the entire virtual machine
Pattern id: DM_EXIT, type: Dm, category: BAD_PRACTICE


Invoking System.exit shuts down the entire Java virtual machine. This should only been done when it is appropriate. Such calls make it hard or impossible for your code to be invoked by other code. Consider throwing a RuntimeException instead.

它提示 System.exit 不应该用来关闭程序。

有人建议我应该如何“当我的程序收到‘退出’命令时关闭应用程序”吗?

最佳答案

你很好。警告说“这应该只在适当的时候”(强调我的)

这是使用 System.exit 的合适方式,因此您可以忽略警告。

或者,如果您的整个程序从 main 运行而没有产生任何新线程,那么您可以从 main 返回并让程序自行关闭。如果您有任何新线程(特别是如果您使用的是 Swing),那么您最好只使用 System.exit...除非这些线程需要做一些清理,在这种情况下,您需要一种方法来优雅地关闭它们。

关于java - 如何正确关闭 java 命令行程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15490985/

相关文章:

gradle - 在 Gradle 的 Findbugs 和 Checkstyle 插件中使用 "excludes"配置

plugins - 如何在 gradle findbugs 插件中将报告的错误打印到控制台?

android - writeDataToFile(String) 可能无法在 FindBugs 中检查异常时清理 java.io.Writer

java - 让注释处理器根据 gradle 标志忽略文件

java - getCursor() 在我的 actionListener 中不起作用

java - 检查字符串是否包含希腊字符串

java - 盒装原语同步

Jenkins 忽略趋势图配置

java - Hibernate @CollectionOfElements 国际化注释

java - 一次 Redis 调用,多次执行返回类型的命令