Java TimerTask хочет, чтобы переменная была окончательной - PullRequest
0 голосов
/ 17 октября 2011

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

timer.schedule(new TimerTask() {

  @Override
  public void run() {
     read.readChat(line);
  }
 }, 0, 1000);

 //Wait for user input
 while(true) {
     String bar = scan.next();
 }

Где read.readChat(line);это метод, который отображает сообщения из другого файла.Java говорит мне, что read и line оба должны быть объявлены как final ... Я не понимаю, почему специально для "line", потому что это переменная, и мне нужно ее изменить.

Кроме того, после того, как я объявляю их окончательными, я получаю эту ошибку:

unreported exception java.lang.Exception; must be caught or declared to be thrown
                            read.readChat(salt);

Что я делаю не так?

Ответы [ 2 ]

2 голосов
/ 17 октября 2011

Вторая ошибка говорит о том, что метод read.readChat(line); выдает исключение checked, поэтому вам нужно перехватить.

Вы не можете использовать локальные переменные, объявленные во внешнем классе в классах Anonymous inner. Сделайте их final или объявите их как fields (переменные экземпляра).

EDIT:

@Override
public void run() {
  try
   {
    read.readChat(line);
   }catch(Exception ex)
   {
     ex.printStackTrace();
   }
}
1 голос
/ 15 декабря 2011

Коди, в какой поток вы хотите добавить это исключение? Прямо сейчас задача таймера будет запущена в другом потоке (Timer). Итак, является ли нить таймера, которая будет иметь дело с этим в вашем текущем проекте. Если вы просто хотите, чтобы прогон повторно выдал исключение, вы можете заключить его в RuntimeException.

@Override
public void run() {
  try  {
    read.readChat(line);
   }catch(RuntimeException ex)  {
     throw ex;
   }catch(Exception ex)  {
     throw new RuntimeException(ex);
   }
}

Но для Timer он ничего не изменит, потому что метод run () - это последнее, что увидит поток Timer. Если вам нужна расширенная обработка ошибок, вы должны иметь дело с ней внутри run (). Не могли бы вы рассказать немного больше о том, что вы пытаетесь сделать?

...