jdk 1.7的try block中Autocloseable的新概念是什么。这是真的需要还是只是为了增强 try catch 块中的某些内容以使其更先进。
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
-block(在 内()
)中打开,并且将自动关闭finally
,而不是像上面的代码示例中那样使用块。
来自Oracle 文档:
try-with-resources 语句是声明一个或多个资源的 try 语句。资源是程序完成后必须关闭的对象。try-with-resources 语句确保每个资源在语句结束时关闭。任何实现 java.lang.AutoCloseable 的对象,包括所有实现 java.io.Closeable 的对象,都可以用作资源。
因此,这意味着所有AutoCloseable
可以以这种方式使用的对象,这意味着ResultSet
可以以 try-with-resources 方式使用 eg 和其他资源。IMO,这简化了编码和可读性。
然而,可读性并不是为什么要使用新方法的杀手锏。我相信资源是自动关闭的,这是一个简单的事实。在 Java 7 之前使用时,可能会忘记执行 null 检查或关闭底层资源 - try-with-resources 更不容易出错。
但是,话虽如此。不需要使用 try-with-resources,即使我不推荐它(因为它既冗长又容易出错),仍然可以使用老式的方式。
阅读Java 7 中引入的try-with-resources特性的文档。
try
-with-resources 语句是声明一个或多个资源的 try 语句。资源是程序完成后必须关闭的对象。try-with-resources 语句确保每个资源在语句结束时关闭。任何实现的对象,java.lang.AutoCloseable
包括所有实现的对象java.io.Closeable
,都可以用作资源。
和Javadoc AutoCloseable#close()
:
关闭此资源,放弃任何基础资源。此方法在由
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