请参见下面的代码示例 错误消息:
错误:(79,22)java:未报告的异常java.io.IOException;必须 被抓到或宣布要扔掉
我为什么要得到这个?我该如何解决?
public AnimalStats() throws IOException{
simulator = new Simulator();
try{
fos = new FileOutputStream("AnimalStats.csv",true);
pw = new PrintWriter(fos);
}
catch(IOException e) {
System.out.println("Error has been caught!");
e.printStackTrace();
}
}
答案 0 :(得分:0)
在向方法签名添加throw Exception时,要求在调用方法的点“上游”处理该异常。
类似这样的东西:
try{
AnimalStats();
}catch(IOException ex){
// DO SOMETHING
}
但是,如果此时使签名保持沉默,则可以使用try / catch块在方法中处理异常,如前所述。但是为此,您需要删除方法签名中的抛出。像这样:
public AnimalStats(){
simulator = new Simulator();
try{
fos = new FileOutputStream("AnimalStats.csv",true);
pw = new PrintWriter(fos);
}
catch(IOException e) {
System.out.println("Error has been caught!");
e.printStackTrace();
}
}
您可以使用任何一种方法。
答案 1 :(得分:-1)
当您指定方法“引发(异常)”时,编译器预计会发生异常,因此他可以将其“引发”回调用方。但是,当您使用“ try / catch”块处理异常时,无法将异常“抛出”给方法的调用者(因为该异常已被处理)。
您的代码的“正确”版本为-
public AnimalStats(){
simulator = new Simulator();
try{
fos = new FileOutputStream("AnimalStats.csv",true);
pw = new PrintWriter(fos);
}
catch(IOException e) {
System.out.println("Error has been caught!");
e.printStackTrace();
}
}
或
public AnimalStats() throws IOException{
simulator = new Simulator();
fos = new FileOutputStream("AnimalStats.csv",true);
pw = new PrintWriter(fos);
}
尽管有很大的不同!
在第一种方法中,方法自身处理Exception。它“不希望”发生异常并返回给调用AnimalStats()的函数。
与第一种方法相反,在后一种方法中,我们声明方法throws (an) IOException
。我们不打算在方法中处理异常,而是将异常“扔回”给调用AnimalStats()的函数并让他们处理。