0

好吧,我在 API 和其他相关问题中看到了这一点:

try {

} catch (IOException e) {
    throw new SampleException("Other IOException", e);
}

这调用了一个新的异常。

但现在我看到了这个自称的例子。我正在尝试编写文档,它似乎再次调用自己。

try {
    statements;
}catch(TheException e) {
    //perform operations before exits;
    throw e; 
}

重新抛出异常,以便其他处理程序有机会处理异常

我想我们不能TheException在我们的catch异常之后再添加一个!那么在这种情况下,谁是另一个处理程序?我对其进行了测试,我意识到即使在 catch 子句之后的代码也没有编译!

4

3 回答 3

2

那么在这种情况下,谁是另一个处理程序?

几乎就好像该catch子句从未存在过一样 - 稍微添加了以后的catch 子句将不会被使用。例如:

try {
    methodWhichCanThrowIOException();
} catch (IOException e) {
    throw e;
} catch (Exception e) {
    // This won't be hit for IOException
}

所以:

  • 如果围绕此代码有另一个 try/catch 语句,则那里的 catch 块可能会捕获异常
  • 否则,假设它是一个检查异常,该方法必须声明它可以抛出异常(或超类),并且异常将以正常方式传播到方法之外

有关所有详细信息,请参阅JLS 的第 11.3 节第 14.20 节。

于 2012-11-05T07:07:33.790 回答
2

尝试修改异常在 JAVA 中的工作方式,尤其是throw/throws关键字以及它们的区别。

这是一个很好的页面来解释这一点。

您可以随时参考文档以获取更多信息。

关于您的问题,您的代码可能无法编译,因为该方法throw可能没有throws TheException。您可以添加throws TheException方法标题以使其正常工作,或者您可以尝试将您的方法包含try/catch在另一个try/catch处理(捕获)TheException中。

于 2012-11-05T07:01:39.693 回答
1

假设您有两种方法。

第一:

public void methodA() throws IOException {

    try {

        // methodWhichCanThrowIOException();

    } catch (IOException e) {

        // //perform operations before exits;
        throw e;
    }
}

第二个:

public void methodB() {

    try {

        methodA();

    } catch (IOException e) {

        // //perform operations;
    }
}

看看方法 B 如何调用方法 A。最初在方法 A 内部引发的异常是方法 A 本身的处理程序,但是一旦完成,方法 A 决定抛出异常,以便其他处理程序有机会处理该异常。作为方法 A 的其他处理程序。请注意,方法 A 可以在不同的类中,在不同的层中。

对于方法 A,抛出异常是通知方法 B 发生了某些事情的好方法。

于 2012-11-05T07:19:06.753 回答