Почему этот оператор завершения повреждается не, работают?

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

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 команда не работает. Какова может быть возможная причина для этого.

Интересная вещь состоит в том, что это происходит не все время. Иногда моя программа хорошо работает, иногда вышеупомянутая описанная проблема происходит.

6
задан izb 19 April 2010 в 13:01
поделиться

5 ответов

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

3
ответ дан 8 December 2019 в 18:34
поделиться

Вы уверены, что хотите продолжить исключение 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) {}
}
2
ответ дан 8 December 2019 в 18:34
поделиться

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

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

4
ответ дан 8 December 2019 в 18:34
поделиться

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

output.println(mess);

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

Game.log.fine(...

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

4
ответ дан 8 December 2019 в 18:34
поделиться

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

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

0
ответ дан 8 December 2019 в 18:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: