java - 带有可关闭参数的 try-with-resources 的行为

标签 java try-with-resources

Java-7 的 try-with-resources 是否需要将 closable 直接分配给变量?简而言之,这段代码是...

    try (final ObjectInputStream ois = new ObjectInputStream(
            new ByteArrayInputStream(data))) {
        return ois.readObject();
    }

相当于这个 block ?...

    try (final ByteArrayInputStream in = new ByteArrayInputStream(data);
         final ObjectInputStream ois = new ObjectInputStream(in)) {
        return ois.readObject();
    }

我对 Java Language Specification 的第 14.20.3 节的理解说他们不一样,必须分配资源。从常见的使用角度来看,这会令人惊讶,而且我找不到任何针对该模式的文档警告。

最佳答案

这两个 block 并不等同,因为它们不会生成相同的代码。但由于 ObjectInputStream.close() 将在您传递给它的 ByteArrayInputStream 上调用 close(),因此第一个 block 完全没问题。

编辑:我忘记的一点是,与 new BufferedInputStream(new *InputStream(...)) 这样的合理构造不同,ObjectInputStream 构造函数实际上是从流中读取的通过它,因此可以合理地抛出异常。出于这个原因,我实际上推荐第二个 block ,而不是第一个 block 。

关于java - 带有可关闭参数的 try-with-resources 的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21484606/

相关文章:

java - 在 try-with-resources block 中管理多个链接资源的正确习惯用法?

java - IntelliJ IDE 在将 Try-Catch 与资源一起使用时出错

java - 将套接字设置为 null 而不是在 Java 中使用 ".close()"是错误的

java - 如何用类之间的相互依赖替换 Java 11 项目中已弃用的 finalize() 方法

java - 如何在java中使用 "closure-compiler "

java - Spring Batch - 了解 block 大小和 ItemReadListener 之间的行为

Java 尝试资源。资源顺序

java - 为java的try with resources语句管理的资源声明自变量

java - 回文中的for循环

java - jdbc 中的 postgres 驱动程序出错