2013-03-19 7 views
5

私は、シェルのような振る舞いをしてユーザのキーボード入力を受け付け、さまざまなアクションを実行する、サーバにメッセージを送ることができるインタラクティブなJavaプログラムを持っています。Javaコマンドラインプログラムを正しくシャットダウンする方法

例えば

myProgram> send "Login as James" to server 

私のプログラムは、このような場合には、それがサーバーに「ジェームズとしてログイン」メッセージを送信し、ユーザの入力を解析し、アクションを実行します。

「quit」をサポートするコマンドの1つで、すべてのサーバー接続が閉じられ、リソースがクリーンアップされ、アプリケーションがシャットダウンされます。私は自分のコードに対してfindbugを実行すると、これはquitコマンドを処理するためのコードが

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

、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)コールを置くと、findbugsはそれに不平を言っていません。 FindBugsはSystem.exitの呼び出しがコード内のさまざまな場所にあってはならないと言っているだけです。 – Mack

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)がこれを呼び出す予定です。

関連する問題