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

难道这条线成功了:

output.println(mess);

但是这一行抛出了一个空指针异常:

Game.log.fine(...

在这种情况下,您将在控制台上看到输出,但永远不会到达 break 语句。Game.log也许是空的?

于 2010-04-19T12:57:52.923 回答
4

Game.log.fine 到底是做什么的?会不会是输出后抛出 NullPtrException 异常,还是你多次调用 post-method?

删除 NullPointerException 的捕获,这是不好的风格(发生 NullPointerException 始终是编程错误)并在方法中添加更多日志消息(或使用调试器)。

于 2010-04-19T13:04:51.863 回答
3

每次调用 post 方法时,您都在启动一个新线程。我认为该方法可以,但调用程序不是。

于 2010-04-19T13:03:39.697 回答
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) {}
}
于 2010-04-19T13:16:29.370 回答
0

假设break语句不起作用,但可能是您的post方法被重复调用。尝试在方法的开头放置另一个日志语句,以查看它被调用的频率。while此外,在循环之后但在方法结束之前放置一条日志语句,run以验证break实际是否脱离了循环。

我也同意其他海报的观点,即捕捉NullPointerException是一种代码气味。你应该首先检查你的变量null

于 2010-04-19T13:49:17.807 回答