Java新特性之try-with-resources语句


参考:

http://docs.oracle.com/javase/8/docs/technotes/guides/language/try-with-resources.html

http://blog.csdn.net/fireofjava/article/details/7220754

http://blog.csdn.net/hengyunabc/article/details/18459463

http://www.kissyu.org/2016/10/06/深入理解Java%20try-with-resource/

http://blog.csdn.net/u013709270/article/details/74358584

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------

原文:    https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html


try-with-resources语句TWR是一个声明1/多个资源的try语句。


资源是一个用完后必须被关闭的对象;换句话说,如果程序P使用了某个资源R,当P执行完成后,必须关闭这个R。


语句TWR担保每个被它使用的资源都会被关闭,当这个TWR执行结束。实现了java.lang.AutoCloseable接口的任意对象,包括实现了java.io.Closeable接口的所有对象(因为public interface Closeable extends AutoCloseable),能够当作一个资源。


下面这个示例从一个文件读取第一行内容。使用一个BufferedReader的实例从这个文件去读取数据。


BufferedReader是,当这个程序片段执行结束后必须被关闭的一个资源。





在这个例子中,语句TWR声明的资源是一个BufferedReader。这个声明语句直接跟在关键字try的后面并且用小括号()括起来。


从>=JavaSE7的版本开始,类BufferedReader实现了接口java.lang.AutoCloseable。


因为BufferedReader实例在TWR语句里面被声明,不管是否try(){}花括号里面的代码正常完成,或者由于readLine方法抛出IOException而突然终止,BufferedReader都会被关闭。


在JavaSE7之前,通常在finally{}花括号代码块关闭资源。以下的这个示例,使用finally{}块而不使用try(){}语句TWR。





但是,在这个例子里,如果方法 readLine 和方法 close 两个都抛出异常,方法 readFirstLineFromFileWithFinallyBlock 会抛出finally{}块的异常,然而try{}抛出的异常会被抑制。


相比之下, 在 readFirstLineFromFile 例子,如果 try{}块 和 try()语句 两个都抛出了异常,方法 readFirstLineFromFile 会抛出来自try{}块的异常,try() 块的 异常被抑制。


从>=JavaSE7后,你可以检索被抑制的异常,看 Suppressed Exceptions 得到更多信息。
---------------------------------------------------------------------------------------------------------------------------------


你可以声明1/多个资源在TWR语句的try的小括号()里面。以下这个例子检索zip要所报的所有文件的名字,同时,创建一个text文件去保存这些名字




在这个例子中,TWR语句包含2个用用分号;隔开的声明ZipFile和BufferedWriter。


直接跟在try()后面的花括号{}代码块,要么正常终止,要么因为异常,ZipFile和BufferedWriter的close方法自动地按这个顺序被调用。


注意,资源的close方法按创建顺序的相反顺序被调用。


以下的例子使用TWR语句去自动关闭java.sql.Statement对象。

这个例子使用的资源Statement是基于>=JDBC 4.1 API 。 注意:TWR语句可以有catch{}和finally{}块,就像普通的try{}语句。在TWR语句里面,当被声明的资源已经被关闭了,任何catch{}或者finally{}块才会执行。 =================================================================================================================================== 被抑制的异常 TWR语句{}的代码块的异常可以抛出。 writeToFileZipFileContents 例子的try{}可以抛出一个异常,TWR语句抛出最多2个异常在努力关闭ZipFile和BufferedWriter对象时候。 try{}可以抛出一个异常;TWR语句抛出1/多个异常,try()块抛出的那些异常是被抑制的异常,也是try块抛出的。 你可以重新找回这些来自try块的被抑制的异常,通过调用方法Throwable.getSuppressed。 实现 接口 AutoCloseable 或者 Closeable 的类 接口Closeable 继承自 接口 AutoCloseable 。  Closeable的close方法抛出IOException异常,而AutoCloseable 抛出Exception异常。 结果就是, 接口 AutoCloseable 的子类 可以 重写  close 方法 ,可以抛出像IOException这些专门的异常,或者 不抛出异常。