Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java TimerTask希望变量是最终的_Java_Variables_Final_Timertask - Fatal编程技术网

Java TimerTask希望变量是最终的

Java TimerTask希望变量是最终的,java,variables,final,timertask,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(行

无论如何,我正在尝试制作一个聊天程序,有人告诉我使用此代码检查新消息,同时允许用户提交消息:

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(行)
是显示来自另一个文件的消息的方法。Java告诉我,
read
line
都必须声明为
final
。。。我不明白为什么特别是对于“
行”
,因为这是一个变量,我需要更改它

另外,在我将它们声明为最终版本后,我会出现以下错误:

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

我做错了什么?

第二个错误告诉您方法
read.readChat(line)
抛出一个
选中的
异常,因此您必须捕获

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

编辑:


第二个错误告诉您方法
read.readChat(line)
抛出一个
选中的
异常,因此您必须捕获

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

编辑:


Cody,你想把异常抛出到哪个线程?现在,计时器任务将在另一个线程(计时器)中运行。那么,在您当前的设计中,将要处理它的计时器线程。如果您只是希望运行重新抛出异常,可以将其包装为RuntimeException

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

但是,对于计时器,它不会改变任何东西,因为run()方法是计时器线程最不可能看到的。如果需要高级错误处理,则必须在run()中处理它。你能告诉我你想做什么吗?

Cody,你想把这个异常抛出到哪个线程?现在,计时器任务将在另一个线程(计时器)中运行。那么,在您当前的设计中,将要处理它的计时器线程。如果您只是希望运行重新抛出异常,可以将其包装为RuntimeException

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

但是,对于计时器,它不会改变任何东西,因为run()方法是计时器线程最不可能看到的。如果需要高级错误处理,则必须在run()中处理它。你能再告诉我一点你想做什么吗?

好吧,很公平,让我们假设我把它们都定为最终的,我找到了一个解决办法,现在捕获或声明异常如何?@Cody:这条消息说,
read.readChat(salt)
行抛出一个声明的异常,你必须处理它。将代码包装在
try-catch
块中以处理异常,因为您的方法不允许抛出。@code:如果您确实想将其从该方法中抛出,则需要将其包装在
RuntimeException
(未选中)中,并将其从
catch
正文中抛出(因此您仍然需要添加
try-catch
块)@Codetry{read.readChat(line);}catch(Exception e){throw new RuntimeException(e);}see好的,很公平,假设我将它们都设置为最终版本,我找到了一个解决方法,现在捕获或声明异常如何?@Cody:这条消息是说lineread.readChat(salt)
抛出一个声明的异常,您必须处理它。将代码包装在
try-catch
块中以处理异常,因为您的方法不允许抛出。@code:如果您确实想将其从该方法中抛出,则需要将其包装在
RuntimeException
(未选中)中,并将其从
catch
正文中抛出(因此您仍然需要添加
try-catch
块)@Codetry{read.readChat(line);}catch(Exception e){throw new RuntimeException(e);}我不知道如何让它抛出异常。我试图在
void run()
之后放置
throws Exception
,但这只会给我带来更多的问题,无法解决这个问题:(。我不知道如何使它抛出异常。我试图在
void run()之后放置
throws Exception
但这只会给我带来更多的问题,并不能解决这个问题:(。