我有以下代码:
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
命令不起作用。可能的原因是什么?
有趣的是,它并非总是发生。有时我的程序运行正常,有时会出现上述问题。
答案 0 :(得分:4)
这条线能否成功:
output.println(mess);
但是这一行抛出了一个空指针异常:
Game.log.fine(...
在这种情况下,您将在控制台上看到输出,但永远不会达到break语句。 Game.log
可能为空吗?
答案 1 :(得分:4)
Game.log.fine究竟做了什么?可能是它在输出后抛出NullPtrException,还是可能是你多次调用post方法?
删除NullPointerException的catch,这是错误的样式(出现NullPointerException总是编程错误)并在方法中添加一些日志消息(或使用调试器)。
答案 2 :(得分:3)
每次调用post方法时都会启动一个新线程。我的方法是可以的但是来电程序不是。
答案 3 :(得分:2)
您确定要继续使用NullPointerException吗?如果你在循环中得到一个,你可能会永远等待。
如果你确定status
最终总是"serviceResolved"
,那么在if语句中放一个 try ... finally ,这样如果出现问题,循环仍然退出:
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) {}
}
答案 4 :(得分:0)
您假设 break
语句不起作用,但可能是您的post
方法被重复调用。尝试在方法的开头放置另一个日志语句,以查看它被调用的频率。另外,在while
循环之后但在run
方法结束之前放置一个日志语句,以验证break
实际上已经脱离循环。
我也同意其他海报,捕捉NullPointerException
是一种代码气味。您应首先检查null
的变量。