Почему этот оператор break не работает? - PullRequest
6 голосов
/ 19 апреля 2010

У меня есть следующий код:

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 ]

4 голосов
/ 19 апреля 2010

Что именно делает Game.log.fine? Может ли быть так, что он генерирует исключение NullPtrException после вывода, или может быть, что вы вызываете post-метод несколько раз?

Удалите перехват NullPointerException, это плохой стиль (возникновение NullPointerException всегда является ошибкой программирования) и добавьте еще несколько сообщений журнала в метод (или используйте отладчик).

4 голосов
/ 19 апреля 2010

Может быть, эта строка завершится успешно:

output.println(mess);

но эта строка выдает исключение нулевого указателя:

Game.log.fine(...

В этом случае вы увидите вывод на консоли, но оператор break никогда не будет достигнут. Game.log возможно ноль?

3 голосов
/ 19 апреля 2010

Вы создаете новую тему каждый раз, когда вызываете метод post. Я думаю, что метод в порядке, но программа вызывающего абонента - нет.

2 голосов
/ 19 апреля 2010

Вы уверены, что хотите продолжать использовать исключение NullPointerException? Если вы попадете в цикл, вы, вероятно, будете ждать вечно.

Если вы уверены, что status всегда будет "serviceResolved", поместите try ... finally внутри оператора 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) {}
}
0 голосов
/ 19 апреля 2010

Вы предполагаете , что оператор break не работает, но возможно, что ваш post метод вызывается повторно. Попробуйте поместить другой оператор журнала в начале метода, чтобы увидеть, как часто он вызывается. Кроме того, поместите оператор log после цикла while, но до конца метода run, чтобы убедиться, что break действительно вышел из цикла.

Я также согласен с другими постерами, что поймать NullPointerException - это запах кода. Сначала вы должны проверить переменные на null.

...