6

次のコードがあります。

public void post(String message) {
    final String mess = message;
    (new Thread() {
        public void run() {
            while (true) {
                try {
                    if (status.equals("serviceResolved")) {
                        output.println(mess);
                        Game.log.fine("The following message was successfully sent: " + mess);
                        break;
                    } else {
                        try {Thread.sleep(1000);} catch (InterruptedException ie) {}
                    }
                } catch (NullPointerException e) {
                    try {Thread.sleep(1000);} catch (InterruptedException ie) {}
                }
            }
        }
    }).start();
}

私のログファイルには、次のような行がたくさんあります。

The following message was successfully sent: blablabla
The following message was successfully sent: blablabla
The following message was successfully sent: blablabla
The following message was successfully sent: blablabla

そして、私のプログラムは応答しません。

breakコマンドが機能しないようです。その理由として何が考えられるでしょうか。

興味深いことは、それが常に起こるわけではないということです。私のプログラムが正常に動作することもあれば、上記の問題が発生することもあります。

4

5 に答える 5

4

Game.log.fine は正確に何をしますか? 出力後に NullPtrException がスローされる可能性がありますか、それとも post-method を数回呼び出す可能性がありますか?

NullPointerException のキャッチを削除します。これは不適切なスタイルです (NullPointerException の発生は常にプログラミング エラーです)。メソッドにログ メッセージを追加します (またはデバッガーを使用します)。

于 2010-04-19T13:04:51.863 に答える
4

この行が成功する可能性があります:

output.println(mess);

しかし、この行はヌルポインタ例外をスローしています:

Game.log.fine(...

この場合、コンソールに出力が表示されますが、break ステートメントには到達しません。Game.logおそらくnullですか?

于 2010-04-19T12:57:52.923 に答える
3

post メソッドを呼び出すたびに、新しいスレッドを開始しています。メソッドは問題ないと思いますが、呼び出し元プログラムはそうではありません。

于 2010-04-19T13:03:39.697 に答える
2

NullPointerException を続行してもよろしいですか? ループ内で 1 つ取得すると、永遠に待機する可能性があります。

statusそれが常に最終的に になると確信している場合は、 if ステートメント内にtry...finally"serviceResolved"を入れて、何かが失敗した場合でもループが終了するようにします。

if (status.equals("serviceResolved")) {
    // No matter what happens next, we have to bail
    try {
        output.println(mess);
        Game.log.fine("The following message was successfully sent: " + mess);
    } finally {
        break;
    }
} else {
    try {Thread.sleep(1000);} catch (InterruptedException ie) {}
}
于 2010-04-19T13:16:29.370 に答える
0

ステートメントが機能していないと想定していますが、メソッドが繰り返し呼び出されている可能性があります。メソッドの先頭に別のログ ステートメントを配置して、メソッドが呼び出される頻度を確認してください。また、ループの後、メソッドの終了前にログ ステートメントを配置して、実際にループから抜け出したことを確認します。breakpostwhilerunbreak

NullPointerExceptionキャッチはコードの匂いだという他のポスターにも同意します。null最初に変数を確認する必要があります。

于 2010-04-19T13:49:17.807 に答える