在JDK的FilterOutputStream中看到如下代码段:
public void close() throws IOException {
try (OutputStream ostream = out) {
flush();
}
}
close方法,只有flush而没有close?
不要紧张,仔细观察,这个 try(){} 与以往的 try{} 有点不同。
详解:try-with-resources语法糖(jdk1.7新特性),称为ARM块(Automatic Resource Management),自动资源管理。
1. 该语法结构执行顺序为:
(1)执行try代码块{}中的语句
(2)调用try()小括号中所有对象的close()方法。有多个变量时,由反编译可知,关闭的顺序是逆序关闭即从后往前关闭;try()小括号中的对象类型必须实现 AutoCloseable 接口。
(3)若try块{}异常,则执行catch中的逻辑
(4)若存在finally块,则执行其逻辑
2. 异常处理情况:
(1)无论try块是否发生异常,紧接着都会自动调用close方法,然后才判断是否进入catch块;
(2)try块发生异常,catch捕捉并处理异常。如果close也发生异常,catch块只捕捉try块抛出的异常,close方法的异常会在catch中被压制,但是在catch块中,可用Throwable.getSuppressed方法来获取到压制异常的数组。
(3)如果try块未异常,close产生异常,此时抛出close的异常。