使用try资源打开资源时会发生什么情况会引发异常?

时间:2016-10-26 18:44:57

标签: java exception try-catch

我正在使用try表达式,我在这里阅读了java文档。 https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html

据我所知,如果资源关闭且try块中的代码都抛出异常,则会抑制close异常。但是在资源开放的情况下会发生什么抛出异常?我是否需要使用封闭的捕获物捕获它?这是怎么回事?

try (Statement stmt = con.createStatement()) {
        // use stmt here
}

让我们说创建语句会引发错误,现在会发生什么?被抑制了吗?我想区分这个异常和成功创建语句并且块抛出异常时可能抛出的任何异常。

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

  

让我们说创建语句会引发错误,现在会发生什么?是吗   抑制

不,它没有被抑制,它被抛出,确实你的代码根据 Java规范§14.20.3.1等同于:

Throwable primaryExc = null;
Statement stmt = null;
try {
    stmt = con.createStatement();
    // use stmt here
} catch (Throwable e) {
    primaryExc = e;
    throw e;
} finally {
    if (stmt != null) {
        if (primaryExc != null) {
            try {
                stmt.close();
            } catch (Throwable ex) {
                primaryExc.addSuppressed(ex);
            }
        } else {
            stmt.close();
        }
    }
}

因此,您可以看到createStatement()是否抛出异常,如果未明确捕获,则调用代码必须将此异常作为正常异常处理。

请注意,与上面的等效代码段一样,如果stmt.close()try-with-resources语句自动调用时抛出异常,则调用代码必须处理此异常,因为它赢了“也被压制了。

try-with-resources语句添加了抑制异常的能力,以便能够获取在close()上调用try时已经抛出的异常,而try (Statement stmt = con.createStatement()) { throw new RuntimeException("foo"); } catch (Exception e) { // Here e is my RuntimeException, if stmt.close() failed // I can get the related exception from e.getSuppressed() } 已经在{{{ 1}}阻止,例如:

body