声明一个抛出异常的方法和这个异常的子类,例如IOException和FileNotFoundException是否有意义?
我猜想它是用来通过调用者方法以不同的方式处理这两个异常的。但是,如果该方法只抛出最通用的异常,即IOException ,是否可以同时处理这两个异常?
声明一个抛出异常的方法和这个异常的子类,例如IOException和FileNotFoundException是否有意义?
我猜想它是用来通过调用者方法以不同的方式处理这两个异常的。但是,如果该方法只抛出最通用的异常,即IOException ,是否可以同时处理这两个异常?
但是,如果方法只抛出最通用的 IOException,是否可以同时处理这两个异常?
绝对地。您仍然可以单独捕获它们:
try {
methodThrowingIOException();
} catch (FileNotFoundException e) {
doSomething();
} catch (IOException e) {
doSomethingElse();
}
因此,如果方法声明两者,调用者可以做什么没有区别- 这是多余的。但是,它可以强调您可能要考虑的例外情况。这可以在 Javadoc 中完成,而不仅仅是 throws 声明。
声明一个抛出异常的方法和这个异常的子类,比如IOException和FileNotFoundException,有意义吗?
通常不会——我知道的大多数 IDE 甚至会针对此类声明发出警告。您可以而且应该做的是记录 Javadoc 中抛出的不同异常。
但是,如果方法只抛出最通用的 IOException,是否可以同时处理这两个异常?
是的,您只需要确保捕获块的顺序正确,即首先更具体。Catch 块按照它们定义的顺序进行评估,所以在这里
try {
...
} catch (FileNotFoundException e) {
...
} catch (IOException e) {
...
}
如果抛出的异常是 a FileNotFoundException
,则会被第一个catch
块捕获,否则会掉到第二个并作为一般处理IOException
。相反的顺序不会像catch (IOException e)
捕获所有IOException
s 一样起作用,包括FileNotFoundException
. (事实上,后者会导致编译错误 IIRC。)
但是,如果该方法只抛出最通用的即 >IOException,是否可以同时处理这两个异常?
catch(IOException ex){
if(ex instanceof FileNotFoundException){}
}
但这看起来不太干净,抛出两个异常看起来不错,甚至调用者也会知道这个方法可能会抛出这些异常,所以他们会正确处理它
是的,如果方法只抛出 IOException,则可以同时处理这两种情况。
回答此类问题的最佳方法是编写一个测试来演示并尝试一下。让JVM告诉你答案。它会比在这里问更快。
是的。当某些特殊异常可以正确处理时。是,如果您按以下方式处理异常:
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...
}
声明该方法可能会抛出(更通用)IOException
和(更具体)FileNotFoundException
通常是一件好事 - 对于以后使用您的代码的人来说,这是一个额外的信息。请注意,您应该在 JavaDoc 中明确说明在什么情况下会引发每个异常。
他们仍然能够区分异常,并使用像这样的 catch 构造以不同方式处理它们:
try {
yourAwesomeMethod()
} catch (FileNotFoundException ex) {
// handle file-not-found error
} catch (IOException ex) {
// handle other IO errors
}