0

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

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”,因为那是一个变量,我需要它来改变。

此外,在我将它们声明为 final 之后,我得到了这个错误:

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

我究竟做错了什么?

4

2 回答 2

2

第二个错误告诉您该方法read.readChat(line);引发checked异常,因此您必须捕获。

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

编辑:

@Override
public void run() {
  try
   {
    read.readChat(line);
   }catch(Exception ex)
   {
     ex.printStackTrace();
   }
}
于 2011-10-17T04:06:45.147 回答
1

Cody,您希望将异常抛出到哪个线程?现在定时器任务将在另一个线程(定时器)中运行。那么,在您当前的设计中将要处理它的计时器线程是什么。如果你只是想让运行重新抛出一个异常,你可以将它包装到一个 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() 中处理它。你能多谈谈你想要做什么吗?

于 2011-12-15T00:22:30.213 回答