5

我有一个交互式 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 不应该用于关闭程序。

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

4

4 回答 4

10

你没事。警告说“只有在适当的时候才应该这样做”(强调我的)

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

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

于 2013-03-19T03:29:14.083 回答
1

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

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

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

于 2013-03-19T03:39:18.830 回答
0

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

于 2013-03-19T03:29:33.087 回答
-1

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

于 2017-11-16T06:51:34.340 回答