簡體   English   中英

為什么這個break語句不起作用?

[英]Why does this break statement break not work?

我有以下代碼:

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命令不起作用。 可能的原因是什么?

有趣的是,它並非總是發生。 有時我的程序工作正常,有時會出現上述問題。

可能是這條線成功了:

output.println(mess);

但是這一行拋出了一個空指針異常:

Game.log.fine(...

在這種情況下,您將在控制台上看到輸出,但永遠不會達到break語句。 Game.log可能是null嗎?

Game.log.fine究竟做了什么? 可能是它在輸出后拋出NullPtrException,還是可能是你多次調用post方法?

刪除NullPointerException的catch,這是錯誤的樣式(NullPointerException的出現總是編程錯誤)並在方法中添加一些更多的日志消息(或使用調試器)。

每次調用post方法時都會啟動一個新線程。 我的方法是可以的但是來電程序不是。

你確定要繼續使用NullPointerException嗎? 如果你在循環中得到一個,你可能會永遠等待。

如果你確定status最終總是"serviceResolved" ,那么在if語句中最后放一個try ...,這樣如果出現故障,循環仍會退出:

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) {}
}

假設 break語句不起作用,但可能是您的post方法被重復調用。 嘗試在方法的開頭放置另一個日志語句,以查看它被調用的頻率。 此外,在while循環之后但在run方法結束之前放置一個日志語句,以驗證break實際上是否已從循環中break

我也同意其他海報,捕捉NullPointerException是一種代碼氣味。 您應首先檢查變量是否為null

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM