Java-无法处理IOException;必须声明被抓住或被抛出

时间:2019-02-24 13:56:12

标签: java ioexception

请参见下面的代码示例 错误消息:

  

错误:(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();

    }
}

2 个答案:

答案 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()的函数并让他们处理。