2010-04-19 3 views
6

У меня есть следующий код:Почему этот break 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 не работает. Что может быть причиной этого.

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

+0

FWIW: вы можете разделить две строки Thread.sleep() на одну строку, выполненную после самой последней попытки/catch. –

+2

Поймать «NullPointerException» не кажется отличной идеей (нужно ли проверять, является ли «статус == null» - если это так, проверьте, является ли «статус» «нулевым»).И 'InterruptedException' должно быть сделано, чтобы вырваться из цикла (не то, что мне нравится прерывание потока, но оно есть и поэтому должно быть рассмотрено)./Также вы можете сделать параметр 'final', поэтому вам не нужна копия' mess'. –

+0

Это явная причина того, почему вы не должны замолчать исключение, если вам действительно не нужно это делать: отладка становится адской. – Jack

ответ

3

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

+0

, вероятно, должен использовать очередь, с задачей потока/исполнителя, которая запускается один раз и читает очередь –

+0

. Вы правы. У меня было много строк сообщения, потому что вышеупомянутый код вызывался много раз, и его вызывали много раз, потому что я многократно нажимал кнопку отправки (когда моя программа была заморожена). И моя программа была заморожена из-за другой глупой ошибки, которая не связана с данным кодом. – Roman

4

Может быть, что эта линия успешно:

output.println(mess); 

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

Game.log.fine(... 

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

+1

Этого не может быть, потому что он сообщил, что видел сообщение «Было отправлено следующее сообщение:', которое находится в строке 'Game.log'. – polygenelubricants

+1

Я что-то упустил? OP говорит, что он получает выход в журнал, что подразумевает, что 'Game.log' не может быть« null »... –

+0

Я бы также воспринял это как урок, чтобы свести к минимуму объем блоков try, чтобы уловы были более значимым. –

4

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

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

2

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

Если вы уверены, что status всегда будет в конечном итоге будет "serviceResolved", затем положить попробовать ... наконец внутри если заявление так, что если что-то выходит из строя, цикл по-прежнему выходит:

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

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^