代码
MyFlow MyFlow
public class MyFlow implements AutoCloseable {
@Override
public void close() {
System.out.println("MyFlow close方法执行");
}
}
MyFlow 2
import java.io.IOException;
/**
* @description:
* @author: pp_lan
* @date: 2022/2/26 16:06
*/
public class MyFlow2 implements AutoCloseable {
@Override
public void close() throws IOException {
System.out.println("MyFlow2 close方法执行");
}
}
FlowDemo
/**
* @description:
* @author: pp_lan
* @date: 2022/2/26 14:29
*/
public class FlowDemo {
public static void main(String[] args) {
try (MyFlow myFlow1 = new MyFlow();
MyFlow2 myFlow2 = new MyFlow2();){
System.out.println("开始执行代码主体");
int i = 10 / 0;
} catch (Exception e) {
System.out.println("进入异常捕获");
} finally {
System.out.println("进入finally");
}
}
}
执行结果
开始执行代码主体
MyFlow2 close方法执行
MyFlow close方法执行
进入异常捕获
进入finally
结论
try中的代码 --> close --> catch --> finally
插曲
之前实现,close一直先于 主体代码执行,一直怀疑实现原理
错误的执行结果
MyFlow2 close方法执行2
开始执行代码主体
MyFlow close方法执行
进入异常捕获
进入finally
MyFlow2 close方法执行2
开始执行代码主体
MyFlow close方法执行
进入异常捕获
进入finally
错误代码
public class MyFlow2 implements AutoCloseable {
@Override
public void close() {} {
System.out.println("MyFlow2 close方法执行2");
}
}
原因
close方法定义后面多了一对 {},其实际排版如下
public class MyFlow2 implements AutoCloseable {
@Override
public void close() {
}
{
System.out.println("MyFlow2 close方法执行2");
}
}
实质是close方法实现,为空。后面跟了一个代码块,初始化的时候会直接执行。