10.2.7 Java 7的自动关闭资源的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
语句相当于包含了隐式的finally
块(这个finally
块用于关闭资源),因此这个try
语句可以既没有catch
块,也没有finally
块。
Java 7几乎所有的资源类都可以自动关闭
Java 7
几乎把所有的”资源类”(包括文件IO的各种类、JDBC
编程的Connection
、Statement
等接口)进行了改写,改写后资源类都实现了AutoCloseable
或Closeable
接口。
如果程序需要,自动关闭资源的try
语句后也可以带多个catch
块和一个finally
块。