5

ユーザーがシェルのように動作し、ユーザーのキーボード入力を受け入れてさまざまなアクションを実行するサーバーにメッセージを送信できるインタラクティブなJavaプログラムがあります。

例えば

myProgram> send "Login as James" to server

私のプログラムはユーザー入力を解析し、アクションを実行します。この場合、「Login as James」というメッセージをサーバーに送信します。

すべてのサーバー接続を閉じ、リソースをクリーンアップし、アプリをシャットダウンする「quit」をサポートするコマンドの 1 つです。この終了コマンドを処理するコードは次のとおりです。

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")) { }呼び出しのようなものです。shutdown()

于 2013-03-19T03:29:33.087 に答える