【问题标题】:Catching java exceptions FileNotFound and IOException at the same time同时捕获java异常FileNotFound和IOException
【发布时间】:2014-04-07 09:52:24
【问题描述】:

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) {}

感谢您提供的任何帮助!

【问题讨论】:

    标签: java ioexception filenotfoundexception


    【解决方案1】:

    FileNotFoundException 是否是 IOException 的“子异常”?

    是的,FileNotFoundException 扩展 IOException:

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

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

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

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

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

    【讨论】:

      【解决方案2】:

      是的。

      如果你看继承FileNotFoundExceptionIOException 的子类。通过捕获超类,您还可以捕获任何扩展它的东西。

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

      【讨论】:

        【解决方案3】:

        从 Java 7 开始,您可以这样做:

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

        【讨论】:

        • 这是真的,但在这种情况下是转移注意力。当一个扩展另一个时,您不需要捕获不同的异常类型。
        • 我的评论后修改了答案:-)
        【解决方案4】:

        FileNotFoundException 是否是 IOException 的“子异常”?

        Yes it is.

        如果我在我的方法中抛出一个 IOException,而不是捕获异常,该怎么办?

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

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

        是的。如果一个方法声明抛出A,如果B继承A,你可以捕获B(即使B没有被A明确抛出)。

        旁注:

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

        第一点很重要。你 .close() 在你的 try 块中;如果您可以成功打开文件但无法从中读取文件或其他任何内容,.close() 被调用。你应该这样做:

        FileInputStream in = ...;
        try {
            // operate on "in"
        } finally {
            in.close();
        }
        

        对于 Java 7:

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

        【讨论】:

          【解决方案5】:

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

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

          【讨论】:

            猜你喜欢
            • 2012-12-18
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-06-03
            • 2013-01-31
            • 2016-03-10
            • 2010-11-25
            相关资源
            最近更新 更多