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这些专门的异常,或者 不抛出异常。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值