T31训练营 DAY8

JDK7引入了try-with-resources的语法,可以自动关闭在try括号内打开的实现Closeable或者AutoCloseable接口的资源。其实try-with-resource机制是一种语法糖,其底层实现原理仍然是try{}catch(){}finally{}写法,执行顺序是:try块->自动关闭->catch块->finally块,其中自动关闭最先关闭最后打开的资源,逐个资源关闭,最先打开的资源最后关闭,先关闭的资源抛出的异常,会被后关闭的资源抛出的异常抑制(Suppressed),最后只抛出最后一个异常可以被catch捕获,因为try块中的业务逻辑先执行,资源关闭后执行,所以资源关闭抛出的异常也会抑制try块中业务逻辑的异常,可以通过getSuppressed()方法获得全部关闭连接的异常。

需要注意的是,如果资源未在try中定义,如下例所示的GZIPOutputStream构造方法内实例化FileOutputStream,则不会被自动关闭。

try (FileInputStream fin = new FileInputStream(new File("in.txt"));
    GZIPOutputStream out = new GZIPOutputStream(new FileOutputStream(new File("out.txt")))) {
    //dosomething
} catch(IOException e) {
    //log error
}

JDK9中对try-with-resources语法进行了优化,如果已经有一个资源是final或等效于final的变量,可以在try-with-resources 语句中使用该变量,而无需在try-with-resources语句中声明一个新变量。上例可以改写成如下形式,并解决FileOutputStream无法自动关闭问题:

final FileInputStream fin = new FileInputStream(new File("in.txt");
FileOutputStream fout = new FileOutputStream(new File("out.txt"));
GZIPOutputStream out = new GZIPOutputStream(fout);

try (fin;fout;out) {
    //dosomething
} catch(IOException e) {
    //log error
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值