代码之家  ›  专栏  ›  技术社区  ›  Roman

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

  •  6
  • Roman  · 技术社区  · 15 年前

    我有以下代码:

    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 回复  |  直到 15 年前
        1
  •  3
  •   Petar Petrov    15 年前

    每次调用post方法时都会启动一个新线程。我觉得这个方法可以,但调用程序不行。

        2
  •  4
  •   izb    15 年前

    这一行是否成功:

    output.println(mess);
    

    但此行引发空指针异常:

    Game.log.fine(...
    

    在本例中,您将在控制台上看到输出,但从未到达break语句。是 Game.log 也许是空的?

        3
  •  4
  •   Searles    15 年前

    game.log.fine具体做什么?可能是它在输出后引发nullptrException,或者是您多次调用post方法?

    移除NullPointerException的catch,这是错误的样式(NullPointerException的出现总是一个编程错误),并在方法中添加更多的日志消息(或使用调试器)。

        4
  •  2
  •   Marcus Adams    15 年前

    您确定要继续执行NullPointerException吗?如果你在循环中得到一个,你可能会永远等待。

    如果你确定 status 将永远是 "serviceResolved" 然后放一个 最后尝试… 在if语句中,这样如果发生故障,循环仍会退出:

    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) {}
    }
    
        5
  •  0
  •   Jason Day    15 年前

    你是 假设 break 声明不起作用,但可能是 post 正在重复调用方法。尝试将另一条日志语句放在方法的开头,以查看调用该语句的频率。此外,在 while 循环,但在 run 方法验证 打破 实际上是从循环中跳出来的。

    我也同意其他的海报 NullPointerException 是一种代码味道。你应该检查你的变量 null 第一。