JDK7的try-with-resource方式的使用

原创 2017年01月03日 08:42:18

如果使用传统try-catch-finally管理资源链接,代码可能是下面这样,finally代码远远多于业务代码。
这里写图片描述
为了增加代码可读性和可维护性,建议使用jdk7 提供的新特性try-with-resource(只能在表面上省去finally块关闭资源的逻辑):
这里写图片描述
即:try(资源定义){
业务逻辑
}
其实这只是个语法糖,因为编译时编译器会自动帮代码加上finally并调用close方法(前提是这些资源类都实现了Closeable接口)。(将你编译好的.class文件拖入idea即可看到编译后的代码(idea可以反编译出来))
这里写图片描述
可以看出finally代码块中除了正常关闭连接代码外,还包含了addSuppressed()方法,这个方法作用是保证一个异常不被另外一个异常抑制而无法抛出,比如try-catch块代码抛异常,程序会继续执行finally代码,但如果finally代码又抛错,就会导致try-catch的异常无法正常抛出,此时可以使用addSuppressed()方法可以将被抑制的异常也抛出。
参考链接:https://my.oschina.net/fhd/blog/324484
try-with-resource代码确实好用,程序可读性有所提高。但看着上面第二张图片的代码,你是否怀疑资源最大可能被关闭?是否编译器加上的fin.close()方法和out.close()方法就完整了?不是的。请看GZIPOutputStream类的close()方法
下面是GZIPOutputStream类的父类的close()方法(GZIPOutputStream类没重写)
这里写图片描述
close()方法时先调用finish()方法再调用out.close()方法,所以如果finish()方法顺利执行,那么out.close()方法确实可以顺利执行。
但进去finish()方法看看,
这里写图片描述
finish()方法是声明了会抛异常的,也就是finish()方法不见得一定正常执行,也就导致了out.close()方法在finish()方法抛异常时不能被调用,进而导致资源没有被关闭。
对于各个资源类的包装类,内部都是使用装饰者模式实现的,例子中调用out.close()方法,深层次还是调用FileOutputStream类的close方法,既然这样,我们程序就应该最大程度确保最内层资源的close()方法被调用(就算包装类的close()方法抛异常),才能最大程度上保证资源被关闭。
因此上面try-with-resource例子的流嵌套是不合理的,应该使用下面这种方式(分开定义每个Closeable类的资源):
这里写图片描述
看上面分开定义后编译生成的代码(如下):
这里写图片描述
显然,每一层Closeable类的资源的close()方法都被显式地调用。保证了资源最大程度的关闭。

版权声明:本文为博主原创文章,未经博主允许不得转载。

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

try-with-resources语句是一个声明一个或多个资源的 try 语句。一个资源作为一个对象,必须在程序结束之后随之关闭。 try-with-resources语句确保在语句的最后每个资源都...

Java7里try-with-resources分析

这个所谓的try-with-resources,是个语法糖。实际上就是自动调用资源的close()函数。和Python里的with语句差不多。 例如: static String readFirs...

Java7新语法 -try-with-resources

使用try-with-resources, 可以自动关闭实现了AutoCloseable或者Closeable接口的资源。
  • fw0124
  • fw0124
  • 2015年11月20日 15:32
  • 3467

java7新特性之Try-with-resources statement

try-with-resources 语句是一个声明了1到多个资源的try语句。资源是指这个try执行完成后必需close掉的对象,比如connection, resultset等。 try-wit...
  • ynwso
  • ynwso
  • 2012年01月30日 23:43
  • 13116

Properties工具类 Helper ——Java7 try-with-resource

使用Java7 try-with-resource对Properties进行封装。

在 JDK 9 中更简洁使用 try-with-resources 语句

本文详细介绍了自 JDK 7 引入的 try-with-resources 语句的原理和用法,以及介绍了 JDK 9 对 try-with-resources 的改进,使得用户可以更加方便、简洁的使用...

[Java开发之路](20)try-with-resource 异常声明

Try-with-resources是java7中一个新的异常处理机制,它能够很容易地关闭在try-catch语句块中使用的资源。 在java7以前,程序中使用的资源需要被明确地关闭,过程有点繁...

java中try-with-resource

java中try-with-resource 使用

关于try-with-resource的 输入输出流自动关闭

最近在做代码审核的时候,审核工具提示我将 try-catch-finally 给替换掉,而且根据公司相关要求,该提示的级别还不低,不改不予通过. 先看看代码吧:FileReader fr = nul...

JDK1.7新特性之try-with-resources和catch多种异常

try-with-resources语句是一个声明一个或多个资源的
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:JDK7的try-with-resource方式的使用
举报原因:
原因补充:

(最多只允许输入30个字)