为什么这个break语句不起作用?

时间:2010-04-19 12:53:29

标签: java loops break

我有以下代码:

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

有趣的是,它并非总是发生。有时我的程序运行正常,有时会出现上述问题。

5 个答案:

答案 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的变量。