【问题标题】:What is the new concept of Autocloseable in try block in jdk 1.7 [closed]jdk 1.7中try块中Autocloseable的新概念是什么[关闭]
【发布时间】:2015-01-08 08:18:59
【问题描述】:

jdk 1.7 的 try 块中 Autocloseable 的新概念是什么。这是真的需要还是只是为了增强 try catch 块中的某些内容以使其更先进。

【问题讨论】:

标签: java autocloseable


【解决方案1】:

它允许使用try-with-resources,这是 Java 7 的一个新特性。

老派:

InputStream is = null;
try {
    is = ...;
    // do stuff with is...
} catch (IOException e) {
    // handle exception
} finally {
    if (is != null) {
        try {
            is.close();
        } catch (IOException innerE) {
            // Handle exception
        }
    }
}

新学校:

try (InputStream is = ...) {
    // do stuff with is...
} catch (IOException e) {
    // handle exception
}

AutoCloseable 对象可以在try 块中打开(在() 内)并且将自动关闭,而不是像上面的代码示例中那样使用finally 块.

来自Oracle docs

try-with-resources 语句是声明一个或多个资源的 try 语句。资源是程序完成后必须关闭的对象。 try-with-resources 语句确保每个资源在语句结束时关闭。任何实现 java.lang.AutoCloseable 的对象,包括所有实现 java.io.Closeable 的对象,都可以用作资源。

所以,这意味着所有AutoCloseable 的对象都可以这样使用,这意味着例如ResultSet 和其他资源可以以 try-with-resources 的方式使用。 IMO,这简化了编码和可读性

然而,可读性并不是为什么使用new方式的杀手锏。我相信这是一个简单的事实,即资源是自动关闭的。在 Java 7 之前使用时,可能会忘记执行 null 检查或关闭底层资源 - try-with-resources 更不容易出错。

但是,话虽如此。 不需要使用 try-with-resources,尽管我不推荐它(因为它是既冗长又容易出错)。

【讨论】:

  • 解释如何使用它,而不是为什么要使用它
  • 好吧,只是增加了可读性是一个有效的论点
  • @jhamon OP 实际上并没有问 为什么 使用它。他问“这真的需要吗,......”
  • 同意@EJP,我认为,它并不是真正需要的,它只是通过节省两行代码来关闭连接或流来增加复杂性。
  • @Atul_15 这是什么意思?通过使用 try-with-resources 自动关闭,例如InputStream 可以节省很多行。例如。 close 操作可能会抛出异常,必须存在空检查,必须存在 finally-block 等等。我认为 try-with-resources 在可读性和实际避免错误方面是一个很大的改进。
【解决方案2】:

阅读 Java 7 中引入的 try-with-resources 功能的文档。

try-with-resources 语句是声明一个或多个资源的 try 语句。 resource 是一个在程序完成后必须关闭的对象。 try-with-resources 语句确保每个资源在语句结束时关闭。 任何实现java.lang.AutoCloseable的对象,包括所有实现java.io.Closeable的对象,都可以用作资源。

还有AutoCloseable#close()的Javadoc:

关闭此资源,放弃所有底层资源。在try-with-resources 语句管理的对象上自动调用此方法。

这意味着您可以创建自己的 AutoCloseable 资源子类型并在此语句中使用它们。

【讨论】:

    【解决方案3】:
    try (BufferedReader br = new BufferedReader(new InputStreamReader)) {
        // try block
    } catch (IOException e) {
        // No need to close resourse. Only handle exception. Resource will be closed automatically
    }
    

    Java 中有许多实现 Autoclosable 的类。

    下面的链接列出了实现此接口的类。

    http://docs.oracle.com/javase/7/docs/api/java/lang/AutoCloseable.html

    【讨论】:

      猜你喜欢
      • 2016-12-23
      • 2013-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-08
      相关资源
      最近更新 更多