同时捕获java异常FileNotFound和IOException

时间:2014-03-05 11:12:10

标签: java ioexception filenotfoundexception

FileNotFoundException是否以某种方式成为IOException的“子异常”?

这是我的代码在给定路径下打开文件的输入流:

   method(){
        FileInputStream fs;
        try {
            fs = new FileInputStream(path);
            //
            fs.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

为什么我可以忽略FileNotFound而只是捕获IOException呢? FNFException是否是IOException的一部分?

如果我在我的方法中抛出IOException,而不是捕获异常?

    method() throws IOException{

        FileInputStream fs;
        fs = new FileInputStream(path);
        //
        fs.close();

    }

我可以继续在这样的调用方法中捕获FileNotFoundException吗?

    try {

         method();

    }catch (FileNotFoundException e1) {}

感谢您提供的任何帮助!

5 个答案:

答案 0 :(得分:14)

  

FileNotFoundException是否以某种方式成为IOException的“子异常”?

是的,FileNotFoundException 延伸 IOException

java.lang.Object
    java.lang.Throwable
        java.lang.Exception
            java.io.IOException
                java.io.FileNotFoundException
     

为什么我可以忽略FileNotFound而只是捕获IOException?

捕获异常抛出的基类将捕获异常,除非有更具体的catch子句可用。

  

我可以继续在这样的调用方法中捕获FileNotFoundException吗?

绝对!实际上,这是一件好事:您的代码应该只处理它知道如何处理的异常,并让所有其他异常传播到可以更好地处理它的地方。

答案 1 :(得分:3)

是的,是的。

如果你看一下继承FileNotFoundExceptionIOException的子类。通过捕捉超级类,你也可以捕获任何扩展它的东西。

如果您需要以不同方式处理它,可以先在第一个示例中捕获更具体的一个。

答案 2 :(得分:3)

从Java 7开始,您可以:

catch(ExceptionType1 | ExceptionType2 e)执行多次异常捕获。但是,在您的情况下,您可以按照建议捕获IOException。

答案 3 :(得分:3)

  

FileNotFoundException是否以某种方式成为IOException的“子异常”?

Yes it is

  

如果我在我的方法中抛出IOException,该如何捕获异常?

你可以这样做。当一个方法抛出一个excpetion时,它会抛出这个异常或者继承它的任何异常。

  

我可以继续在这样的调用方法中捕获FileNotFoundException吗?

是。如果方法声明抛出A,则B如果B继承A,则可以抓住B(即使A未引发.close()明确地)。

旁注:

  • 您没有正确关闭资源;
  • 如果您使用Java 7,请改用新的Files API。

第一点非常重要。您try块中的.close();如果您可以成功打开文件但无法从中读取文件或其他内容,FileInputStream in = ...; try { // operate on "in" } finally { in.close(); } 进行调用。你应该这样做:

try (
    FileInputStream in = ...;
) {
    // operate on "in"
}
// "in" is closed for you here

对于Java 7:

{{1}}

答案 4 :(得分:2)

是的,正如javadoc所示,FileNotFoundExceptionIOException的子类。

如果你真的想要FileNotFoundException,你必须只捕获这个execption,否则捕获IOException也会捕获任何子类化的异常,比如FileNotFoundException其他许多异常。