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

时间:2013-03-19 03:27:07

标签: java findbugs

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

例如

myProgram> send "Login as James" to server

我的程序将解析用户输入并执行操作,在这种情况下,它会将“Login as 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不应该用于关闭程序。

有人建议我应该如何“在我的程序收到'退出'命令后关闭应用程序”?

4 个答案:

答案 0 :(得分:10)

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

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

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

答案 1 :(得分:1)

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

http://www.javapractices.com/topic/TopicAction.do?Id=86

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

答案 2 :(得分:0)

如果您在循环中接受(等待)命令,只要用户输入退出,就可以跳出循环。这可能是你的while循环的条件......类似于while(!command.equalsIgnoreCase("quit")) { }退出循环后调用shutdown()

答案 3 :(得分:-1)

请改用Runtime.getRuntime().exit(0)。这对我有用。无论如何最终System.exit(0)将会称之为。