2013-03-19 70 views
5

我有一個交互式java程序,允許用戶發送消息到服務器,其行爲有點像一個shell,接受用戶的鍵盤輸入並執行各種操作。如何正確關閉一個java命令行程序

例如

myProgram> send "Login as James" to server 

我的程序將分析用戶輸入並執行行動,在這種情況下,它會發送消息「登錄爲詹姆斯」到服務器。

我支持其「退出」命令之一,它將關閉所有服務器連接,清理資源並關閉應用程序。並處理這個代碼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: 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不應該被用來關閉程序。

任何人都應該如何「我的程序收到'quit'命令時關閉應用程序」?

回答

10

你很好。警告說,「這應該只是已經完成,在適當時候」(重點煤礦)

這是使用System.exit這樣你就可以忽略這個警告的適當方式。

或者,如果您的整個程序是從main運行而不產生任何新線程,那麼您可以從main返回並讓程序自行關閉。如果你有任何新的線程(特別是如果你使用Swing的話),那麼你可能會更好使用System.exit ......除非那些線程需要做一些清理,在這種情況下,你需要一種方法來優雅地關閉它們。

+0

如果將System.exit(0)調用放在main方法的末尾,findbugs不會抱怨它。 FindBugs只是說System.exit調用不應該在代碼的不同位置。 – Mack 2014-06-04 14:27:17

0

如果您正在接受(等待)循環中的命令,只要用戶輸入退出即可跳出循環。這可能是你的while循環的條件...類似while(!command.equalsIgnoreCase("quit")) { }在退出循環之後調用shutdown()

1

System.exit()用於突然退出。儘管它確實調用了任何關閉鉤子,但它不允許沒有一個線程的線程正常結束。這種方法的調用通常是「災難性的錯誤退出」。

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

因此,Sudhanshu建議適當的方式將信號發送到您的解釋器打破,如果輸入的是「退出」。除此之外,您的代碼應該跟蹤所有線程和資源,以便退出後可以進行清理。

0

改爲使用Runtime.getRuntime().exit(0)。這對我有效。無論如何最終System.exit(0)會打電話給這個。