[英]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.