1

如果一个方法抛出了一个 IOException 异常,那么这样做是否会产生负面影响:

catch (Exception ex){

} 

代替

catch (IOException ex){

}

在我的 Java 代码中?

4

5 回答 5

4

当然有/有!

如果您捕获Exception ,您将捕获所有异常(除了ThrowableorError及其子类的实例)。这意味着您将捕获各种未经检查的异常,以及您没有意识到可能会抛出的其他检查异常。

例如:

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 ...
}
于 2013-09-23T12:56:51.460 回答
1

简短的回答
任何最终会出现在第二个区块中的东西都会出现在第一个区块中。但是,有一大堆东西最终会出现在第一个中,而不会出现在第二个中。所以简而言之,你会捕获一大堆你不打算的异常。所以是的,这是个坏主意

不正确的修复应用于错误的问题
我假设在 catch 块内你有某种代码要修复或清理,IOException或者至少告诉最终用户发生了什么(他希望他说),让这段代码运行对于任何Exception可能导致意外结果。此外,它可以隐藏您甚至没有意识到正在发生的异常。

调试困难
想象一下,稍后您更改了导致空指针异常或数组越界的一段代码。然而它一直表现得好像发生了 IO 问题。与刚刚抛出 NullPointerException 相比,这将更难调试。


我已经说过了,但我会重申;那个空的 catch 块只是为了这个例子,对吧?

于 2013-09-23T12:55:35.940 回答
0

IOException 是从 Exception 继承的,所以当你这样做时:

catch (IOException ex)

您只是在捕获 IOException。

但是当你这样做时:

catch (Exception ex)

您正在捕获所有异常,包括 IOException。所以你不知道发生了哪个异常,当 IOException 以外的其他原因导致它时,可以调用它。如果有人想对所有异常一视同仁,可以使用 catch (Exception ex),但如果想对不同的异常类型采取不同的操作,则应该使用 catch (IOException ex)。

于 2013-09-23T12:57:07.563 回答
0

两种方式都可以打印错误消息。通过捕获任何 IOException。明确地,您可以像这样向用户显示自定义错误消息是错误重新升级到 IO 问题或没有其他与之相关的事情

异常处理程序可以做的不仅仅是打印错误消息或停止程序。他们可以进行错误恢复,提示用户做出决定,或使用链式异常将错误传播到更高级别的处理程序。

在捕获异常时,它不仅捕获 IOException,还捕获所有一般异常。

于 2013-09-23T13:01:45.293 回答
0

有些异常是用来报告编程错误的,就是这样的异常

  • ArrayIndexOutOfBounds
  • 空指针异常
  • IllegalArgumentException 等

程序员使用这些异常来指示他们的 API 使用不正确。

另一方面,有一些异常用于报告 API 内部发生的特定问题和异常情况,例如当我们收到 IOException 或 SQLException 时。

今天,习惯上使用未经检查的异常来解决这类问题,例如 JPA API 使用不同的未经检查的异常,如 PersistenceException。

现在,如果您捕获所有异常,那么您最终可能会捕获和处理编程错误以及应用程序异常情况。最好不要处理编程错误,以使它们明显并修复它们并捕获它们只是隐藏它们。

因此,最好首先努力捕获最具体的异常。

于 2013-09-23T13:04:54.307 回答