如果构造函数抛出异常,是否不会调用 try-with-resources 惯用法的 close 方法?

2024-05-04

我有一个基类Base和一个儿童班Child这扩展了它。Base实施java.lang.AutoCloseable.

我们假设构造函数为Child抛出一个Foo.

现在考虑

try (Base c = new Child()){
    /*Some code*/
} catch (final Foo e){
    /*Some more code*/
}

Is the Base#close抛出异常时调用的方法?它不在我的机器上,但这是 JLS 标准化的东西吗?


Yes, close不会被调用。这是 JLS 中指定的第14.20.3节 https://docs.oracle.com/javase/specs/jls/se8/html/jls-14.html#jls-14.20.3:

资源按从左到右的顺序初始化。如果资源无法初始化(即,其初始化表达式抛出异常),则到目前为止由 try-with-resources 语句初始化的所有资源都将关闭。如果所有资源都初始化成功,则 try 块将正常执行,然后关闭 try-with-resources 语句的所有非空资源。

资源以与初始化相反的顺序关闭。仅当资源初始化为非空值时才会关闭。关闭一种资源的异常不会阻止其他资源的关闭。如果之前由初始化程序、try 块或关闭资源引发了异常,则此类异常将被抑制。

在这种情况下,构造函数中会引发异常,因此资源不会初始化为非空值。因此,close方法未被调用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如果构造函数抛出异常,是否不会调用 try-with-resources 惯用法的 close 方法? 的相关文章

随机推荐