声明抛出此异常的异常和子类的方法

时间:2012-06-20 09:45:59

标签: java exception-handling

声明抛出异常的方法是否有意义 和这个例外的子类, 例如 IOException FileNotFoundException

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

6 个答案:

答案 0 :(得分:7)

  

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

绝对。您仍然可以单独捕获

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

因此,如果方法声明两者,那么调用者可以做什么也没有区别 - 这是多余的。但是,它可以强调您可能想要考虑的异常。这可以在Javadoc中完成,而不仅仅是抛出声明。

答案 1 :(得分:3)

  

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

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

  

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

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

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

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

答案 2 :(得分:0)

  

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

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

但这看起来并不干净,抛出两个异常看起来都很好,即使调用者也会知道这个方法可能抛出这些异常,所以他们会正确处理它

答案 3 :(得分:0)

是的,如果方法只抛出IOException,则可以处理两者。

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

答案 4 :(得分: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...
}

答案 5 :(得分:0)

声明该方法可能抛出(更多泛型IOException,而且(更多特定FileNotFoundException通常是件好事 - 它是以后使用您的代码的人的附加信息。请注意,您应该在JavaDoc中明确说明,在什么情况下抛出每个异常。

他们仍然能够区分异常,并使用像这样的catch结构来区别对待它们:

try {
    yourAwesomeMethod()
} catch (FileNotFoundException ex) {
    // handle file-not-found error
} catch (IOException ex) {
    // handle other IO errors
}