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) {}
感谢您提供的任何帮助!
答案 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)
是的,是的。
如果你看一下继承FileNotFoundException
是IOException
的子类。通过捕捉超级类,你也可以捕获任何扩展它的东西。
如果您需要以不同方式处理它,可以先在第一个示例中捕获更具体的一个。
答案 2 :(得分:3)
从Java 7开始,您可以:
catch(ExceptionType1 | ExceptionType2 e)
执行多次异常捕获。但是,在您的情况下,您可以按照建议捕获IOException。
答案 3 :(得分:3)
FileNotFoundException是否以某种方式成为IOException的“子异常”?
如果我在我的方法中抛出IOException,该如何捕获异常?
你可以这样做。当一个方法抛出一个excpetion时,它会抛出这个异常或者继承它的任何异常。
我可以继续在这样的调用方法中捕获FileNotFoundException吗?
是。如果方法声明抛出A
,则B
如果B
继承A
,则可以抓住B
(即使A
未引发.close()
明确地)。
旁注:
第一点非常重要。您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所示,FileNotFoundException
是IOException
的子类。
如果你真的想要FileNotFoundException
,你必须只捕获这个execption,否则捕获IOException
也会捕获任何子类化的异常,比如FileNotFoundException
其他许多异常。