【发布时间】:2015-01-08 08:18:59
【问题描述】:
jdk 1.7 的 try 块中 Autocloseable 的新概念是什么。这是真的需要还是只是为了增强 try catch 块中的某些内容以使其更先进。
【问题讨论】:
标签: java autocloseable
jdk 1.7 的 try 块中 Autocloseable 的新概念是什么。这是真的需要还是只是为了增强 try catch 块中的某些内容以使其更先进。
【问题讨论】:
标签: java autocloseable
它允许使用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,尽管我不推荐它(因为它是既冗长又容易出错)。
【讨论】:
InputStream 可以节省很多行。例如。 close 操作可能会抛出异常,必须存在空检查,必须存在 finally-block 等等。我认为 try-with-resources 在可读性和实际避免错误方面是一个很大的改进。
阅读 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 资源子类型并在此语句中使用它们。
【讨论】:
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
【讨论】: