10.2.7 Java9增强的自动关闭资源的try语句
Java7自动关闭资源的try语句
Java 7
增强了try
语句的功能:它允许在try
关键字后紧跟一对圆括号
,圆括号可以声明、初始化一个或多个资源。此处的资源指的是那些必须在程序结束时显式关闭的资源(比如数据库连接
、网络连接
等),try语句在该语句结束时 自动关闭 这些资源。
什么样的资源可以让try语句自动关闭
为了保证try
语句可以正常关闭资源,这些资源实现类必须实现AutoCloseable
或Closeable
接口,实现这两个接口就必须实现close()
方法。
Closeable和AutoCloseable的区别
Closeable
是AutoCloseable
的子接口,可以被自动关闭的资源类要么实现AutoCloseable
接口,要么实现Closeable
接口。
Closeable
接口里的close()
方法声明抛出了IOException
,因此它的实现类在实现close()
方法时只能声明抛出IOException
或其子类;AutoCloseable
接口里的close()
方法声明抛出了Exception
,因此它的实现类在实现close()
方法时可以声明拋出任何异常。
程序示例
下面程序示范了如何使用自动关闭资源的try
语句。
1 | import java.io.*; |
上面程序中try
后面圆括号中的代码分别声明、初始化了两个IO流,由于BufferedReader
、 PrintStream
都实现了Closeable
接口,而且它们放在try
语句中声明、初始化,所以try
语句会自动关闭它们。因此上面程序是安全的。
自动关闭资源的try语句可以没有catch块也可以没有finally块
自动关闭资源的try
语句相当于包含了隐式的finally
块(这个finally
块用于关闭资源),因此这个try语句可以既没有catch块,也没有finally块。
Java 7几乎所有的资源类都可以自动关闭
Java 7
几乎把所有的“资源类”(包括文件IO的各种类、JDBC
编程的Connection
、Statement
等接口)进行了改写,改写后资源类都实现了AutoCloseable
或Closeable
接口。
如果程序需要,自动关闭资源的try
语句后也可以带多个catch
块和一个finally
块。
Java9对自动关闭资源的try语句的增强
Java9
再次增强了这种try
语句,Java9
不要求在try
后的圆括号内声明并创建资源。
Java9只需要将资源的引用变量放在try后的括号里即可
Java9
允许将需要自动关闭的资源的引用变量放在try
后的圆括号内,只要这些引用变量有final
修饰或者是有效的final( effectively final)
即可。
什么是有效的final
只要不对该变量重新赋值,按该变量就是有效的final。
程序示例
上面程序在Java9
中可改写为如下形式。
1 | import java.io.*; |
可以看到,相较于java7
,try
后面的括号更加精简了,看起来更加舒服。
总结
java7
开始支持自动关闭资源java7
需要在try
后的括号里创建需要自动关闭的资源。java9
只需要将需要自动关闭的资源的引用变量放到try
后面的括号里即可。