2014-03-05 63 views
5

FileNotFoundException是否是IOException的“子异常”?同时捕获java异常FileNotFound和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) {} 

感谢您的任何帮助,您可能会提供!

回答

9

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的子类。通过捕获超类,你也可以捕获任何延伸它的东西。

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

1

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

如果你真的想FileNotFoundException,你必须赶上仅此execption,否则追赶IOException也捕获所有异常继承它,就像FileNotFoundException任何其他许多人。

2

从Java 7起,你可以这样做:

catch(ExceptionType1 | ExceptionType2 e)做多异常捕获。但是,就你的情况而言,你可以按照你的建议捕捉IOException。

+0

这是真实的,但在这种情况下,一个红色的鲱鱼。当一个扩展另一个时,你不需要捕获不同的异常类型。 –

+2

我的评论后修改的答案:-) –

2

FileNotFoundException是否是IOException的“子例外”?

Yes it is

而不是捕捉异常,如果我在我的方法中抛出一个IOException呢?

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

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

是的。如果一种方法声明抛出A,则如果B继承A(即使B未明确抛出A),则可以捕获B

旁注:

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

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

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

对于Java 7:

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