jdk 1.7中try块中Autocloseable的新概念是什么?这是真的需要还是只是为了增强try catch块中的某些功能,使其更加先进。
答案 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