Java 打开资源时使用try resource抛出异常时会发生什么情况?

Java 打开资源时使用try resource抛出异常时会发生什么情况?,java,exception,try-catch,Java,Exception,Try Catch,我正在使用try expression,并阅读了关于它的java文档 我知道,如果资源关闭和try块中的代码都抛出异常,那么关闭异常将被抑制。但是,如果资源打开引发异常,会发生什么情况呢?我需要用一个封闭的锁扣来接住它吗?这是怎么回事 try (Statement stmt = con.createStatement()) { // use stmt here } 假设创建语句抛出错误,现在会发生什么?它被压制了吗?我想区分这个异常和当语句创建成功并且块抛出异常时可能抛出的任何

我正在使用try expression,并阅读了关于它的java文档

我知道,如果资源关闭和try块中的代码都抛出异常,那么关闭异常将被抑制。但是,如果资源打开引发异常,会发生什么情况呢?我需要用一个封闭的锁扣来接住它吗?这是怎么回事

try (Statement stmt = con.createStatement()) {
        // use stmt here
}
假设创建语句抛出错误,现在会发生什么?它被压制了吗?我想区分这个异常和当语句创建成功并且块抛出异常时可能抛出的任何异常

谢谢你的帮助

假设创建语句抛出错误,现在会发生什么?它是 压制

不,它没有被抑制,而是按原样抛出,事实上,您的代码根据Java规范的定义相当于:

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
语句添加了抑制异常的功能,以便在
try
块中已经抛出异常时,能够获取在调用资源上的
close()
时抛出的异常,例如:

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()
}