声明抛出异常的方法是否有意义 和这个例外的子类, 例如 IOException 和 FileNotFoundException ?
我猜它是用来以不同的方式处理调用方法的异常。 但是,如果方法抛出 最通用的,即 IOException ,是否可以处理这两个异常?
答案 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
}