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

如何正确关闭java命令行程序,java,findbugs,Java,Findbugs,我有一个交互式java程序,允许用户向服务器发送消息,服务器的行为有点像shell,接受用户的键盘输入并执行各种操作 比如说 myProgram> send "Login as James" to server 我的程序将解析用户输入并执行操作,在这种情况下,它将向服务器发送消息“Login as James” 其中一个命令,我支持其“退出”,这将关闭所有服务器连接,清理资源和关闭应用程序。处理这个quit命令的代码是 private void shutdown() { closeA

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

比如说

myProgram> send "Login as James" to server
我的程序将解析用户输入并执行操作,在这种情况下,它将向服务器发送消息“Login as James”

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

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

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不应用于关闭程序


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

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

这是使用
系统的适当方法。请退出
,以便忽略警告

或者,如果您的整个程序从
main
运行,而没有产生任何新线程,那么您可以从
main
返回,让程序自行关闭。如果您有任何新线程(特别是在使用Swing的情况下),那么您最好只使用
系统。退出
…除非这些线程也需要进行一些清理,在这种情况下,您需要一种方法将它们全部关闭。

如果您在循环中接受(等待)命令,只要在用户输入退出时中断循环即可。这可能是你的while循环的条件。。。退出循环后,
while(!command.equalsIgnoreCase(“quit”){}
调用
shutdown()

System.exit()
用于突然退出。尽管它确实调用了任何关闭钩子,但它不允许没有钩子的线程正常结束。此方法的调用通常用于“灾难性错误退出”


所以,正如Sudhanshu所建议的,正确的方法是向解释器发送一个信号,在输入为“退出”时中断循环。除此之外,您的代码应该跟踪所有线程和资源,以便在退出后可以进行清理。

使用
Runtime.getRuntime()。退出(0)
。这对我有用。无论如何,
System.exit(0)
最终会调用它。

如果将System.exit(0)调用放在main方法的末尾,那么findbugs不会对此抱怨。FindBugs只是说System.exit调用不应该出现在代码中的各个地方。