У меня есть следующий код:
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
команда не работает. Какова может быть возможная причина для этого.
Интересная вещь состоит в том, что это происходит не все время. Иногда моя программа хорошо работает, иногда вышеупомянутая описанная проблема происходит.
Вы начинаете новую беседу каждый раз, когда вызываете метод публикации. Я считаю, что метод в порядке, а программа вызывающего абонента - нет.
Вы уверены, что хотите продолжить исключение 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) {}
}
Что именно делает Game.log.fine? Может быть, он выбрасывает исключение NullPtrException после вывода, или может быть, что вы вызываете пост-метод несколько раз?
Удалите ловушку NullPointerException, это плохой стиль (возникновение NullPointerException всегда является ошибкой программирования) и добавьте еще несколько сообщений журнала в метод (или используйте отладчик).
Может быть, эта строка завершилась успешно:
output.println(mess);
но эта строка генерирует исключение нулевого указателя:
Game.log.fine(...
В этом случае вы увидите вывод на консоль, но оператор break никогда не достигается. Возможно, Game.log
имеет значение null?
Вы предполагаете , что оператор break
не работает, но возможно, что ваш метод post
вызывается повторно. Попробуйте поместить другой оператор журнала в начало метода, чтобы узнать, как часто он вызывается. Кроме того, поместите оператор журнала после цикла while
, но до конца метода run
, чтобы убедиться, что break
действительно вышел из цикла.
Я также согласен с другими авторами, что обнаружение NullPointerException
- это запах кода. Вы должны сначала проверить свои переменные на null
.