如果一个方法抛出一个IOException,那么是否有任何负面影响:
catch (Exception ex){
}
而不是
catch (IOException ex){
}
在我的Java代码中?
答案 0 :(得分:4)
当然有/是!
如果你抓住Exception
,你将捕获所有异常(除了Throwable
或Error
及其子类的实例)。这意味着您将捕获各种未经检查的异常,以及您未实现的其他已检查异常。
例如:
public class Test {
private File file;
public String load() {
try {
Reader r = new FileReader(file, "UTF-9");
// read file
return // file contents
} catch (Exception ex) {
return "cannot open file";
}
}
}
在这里,Exception
的捕获隐藏了代码中的两个(!)错误。
好的,谢谢。我想我会单独捕捉所有例外情况。
还有另一种选择。 Java 7允许您捕获多个异常,如下所示:
catch (IOException | IllegalArgumentException ex) {
// handle both types of exception ...
}
答案 1 :(得分:1)
简短回答
任何最终会在第二个区块中结束的东西都会在第一个区块中结束。然而,有一大堆东西最终会在第一个不会在第二个中出现; 所以简而言之,你会抓住一大堆你并不打算的例外。所以是的,这是一个坏主意
错误修复应用于错误的问题
我假设在catch块中你有一些代码可以在IOException
之后修复或清理,或者至少告诉最终用户发生了什么(他希望如此),让任何代码运行Exception
可能会导致意外结果。此外,它可以隐藏您甚至没有意识到的异常。
调试困难
想象一下,您稍后会更改导致空指针异常的代码,或者数组超出范围。但它仍然表现得好像发生了IO问题。与刚刚抛出NullPointerException相比,调试要困难得多。
我已经说过了,但我会重申一下;那个空的catch块只适用于这个例子吗?
答案 2 :(得分:0)
IOException继承自Exception,所以当你这样做时:
catch (IOException ex)
您只是捕获IOException。
但是当你这样做时:
catch (Exception ex)
您正在捕获所有异常,包括IOException。所以你不知道发生了哪个异常,当IOException以外的东西引起它时,可以调用它。 如果有人想要同样处理所有异常,可以使用catch(Exception ex),但是如果想要对不同的异常类型采取不同的操作,则应该使用catch(IOException ex)。
答案 3 :(得分:0)
两种方式都可以打印错误信息。通过捕获任何IOException。 明确地,您可以向用户显示自定义错误消息,例如这是错误重新调整为IO问题或者没有与之相关的其他内容,例如
异常处理程序不仅可以打印错误消息或停止程序。他们可以进行错误恢复,提示用户做出决定,或者使用链式异常将错误传播到更高级别的处理程序。
在捕获Exception时,它不仅捕获所有常规异常IOException。
答案 4 :(得分:0)
一些例外用于报告编程错误,例如
之类的例外情况程序员使用这些异常来表明他们的API使用不当。
另一方面,有一些异常用于报告API中发生的特定问题和异常情况,例如当我们收到IOException或SQLException时。
今天,习惯上对这类问题使用未经检查的异常,例如使用不同的未经检查的异常(如PersistenceException)的JPA API。
现在,如果您捕获所有异常,那么您最终可能会捕获并处理编程错误以及应用程序异常情况。编程错误最好不要处理,以使它们明显并修复它们并捕获它们只是隐藏它们。
因此,最好先努力捕捉可能的最具体的例外情况。