Java TimerTask希望变量是最终的

时间:2011-10-17 03:58:48

标签: java variables final timertask

无论如何,我试图制作类似聊天程序的东西,有人告诉我使用此代码检查新消息,同时允许用户提交消息:

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告诉我,readline都必须声明为final ...我不明白为什么特别为“line”,因为这是一个变量,我需要它要改变。

此外,在我将其声明为final后,我收到此错误:

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

我做错了什么?

2 个答案:

答案 0 :(得分:2)

第二个错误告诉您方法read.readChat(line);抛出checked异常,因此您必须抓住。

您不能在匿名inner类中使用外部类声明的局部变量。将它们设为final或将它们声明为fields(实例变量)。

编辑:

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

答案 1 :(得分:1)

Cody,您想要将该异常抛出到哪个线程?现在,计时器任务将在另一个线程(Timer's)中运行。那么,计时器线程是否会在您当前的设计中处理它。如果您只是希望运行重新抛出异常,则可以将其包装为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()内处理它。你能告诉我你想做什么吗?