无论如何,我试图制作类似聊天程序的东西,有人告诉我使用此代码检查新消息,同时允许用户提交消息:
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);
我做错了什么?
答案 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()内处理它。你能告诉我你想做什么吗?