6

声明一个抛出异常的方法和这个异常的子类,例如IOExceptionFileNotFoundException是否有意义?

我猜想它是用来通过调用者方法以不同的方式处理这两个异常的。但是,如果该方法抛出最通用的异常,即IOException ,是否可以同时处理这两个异常?

4

6 回答 6

8

但是,如果方法只抛出最通用的 IOException,是否可以同时处理这两个异常?

绝对地。您仍然可以单独捕获它们:

try {
  methodThrowingIOException();
} catch (FileNotFoundException e) {
  doSomething();
} catch (IOException e) {
  doSomethingElse();
}

因此,如果方法声明两者,调用者可以做什么没有区别- 这是多余的。但是,它可以强调您可能要考虑的例外情况。这可以在 Javadoc 中完成,而不仅仅是 throws 声明。

于 2012-06-20T09:48:11.887 回答
4

声明一个抛出异常的方法和这个异常的子类,比如IOException和FileNotFoundException,有意义吗?

通常不会——我知道的大多数 IDE 甚至会针对此类声明发出警告。您可以而且应该做的是记录 Javadoc 中抛出的不同异常。

但是,如果方法只抛出最通用的 IOException,是否可以同时处理这两个异常?

是的,您只需要确保捕获块的顺序正确,即首先更具体。Catch 块按照它们定义的顺序进行评估,所以在这里

try {
  ...
} catch (FileNotFoundException e) {
  ...
} catch (IOException e) {
  ...
}

如果抛出的异常是 a FileNotFoundException,则会被第一个catch块捕获,否则会掉到第二个并作为一般处理IOException。相反的顺序不会像catch (IOException e)捕获所有IOExceptions 一样起作用,包括FileNotFoundException. (事实上​​,后者会导致编译错误 IIRC。)

于 2012-06-20T09:49:59.593 回答
0

但是,如果该方法只抛出最通用的即 >IOException,是否可以同时处理这两个异常?

catch(IOException ex){
 if(ex instanceof FileNotFoundException){}
}

但这看起来不太干净,抛出两个异常看起来不错,甚至调用者也会知道这个方法可能会抛出这些异常,所以他们会正确处理它

于 2012-06-20T09:47:48.890 回答
0

是的,如果方法只抛出 IOException,则可以同时处理这两种情况。

回答此类问题的最佳方法是编写一个测试来演示并尝试一下。让JVM告诉你答案。它会比在这里问更快。

于 2012-06-20T09:48:40.870 回答
0

是的。当某些特殊异常可以正确处理时。是,如果您按以下方式处理异常:

try {
} catch (FileNotFoundException f) {
//Try a different file
} catch (IOException ioe) {
//Fatal, Maybe bad blocks ... Bail out... 
} catch (Exception e) {
//Something went wrong, see what it is...
}
于 2012-06-20T09:48:57.203 回答
0

声明该方法可能会抛出(更通用IOException和(更具体FileNotFoundException通常是一件好事 - 对于以后使用您的代码的人来说,这是一个额外的信息。请注意,您应该在 JavaDoc 中明确说明在什么情况下会引发每个异常。

他们仍然能够区分异常,并使用像这样的 catch 构造以不同方式处理它们:

try {
    yourAwesomeMethod()
} catch (FileNotFoundException ex) {
    // handle file-not-found error
} catch (IOException ex) {
    // handle other IO errors
}
于 2012-06-20T09:51:02.880 回答