在jdk 1.7中的try块中,Autocloseable的新概念是什么?

时间:2015-01-08 08:18:59

标签: java autocloseable

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

3 个答案:

答案 0 :(得分:3)

它允许使用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的所有对象都可以这种方式使用,这意味着可以使用try-with-resources方式使用ResultSet和其他资源。 IMO,这简化了编码和可读性

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

但是,随着说。 不需要使用try-with-resources,仍然可以使用 old-school 方式,即使我不推荐它(因为它是既详细又容易出错。

答案 1 :(得分:1)

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

  

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

AutoCloseable#close()的Javadoc:

  

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

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

答案 2 :(得分:0)

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