package com.xiaobu.test.daily.autoCloseAble;
import java.io.DataOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
/**
* @author xiaobu
* @version JDK1.8.0_171
* @date on 2019/7/31 17:33
* @description
*/
public class AutoClose implements AutoCloseable {
@Override
public void close() throws Exception {
System.out.println(">>> close()");
throw new RuntimeException("Exception in close()");
}
public void work() throws RuntimeException {
System.out.println(">>> work()");
throw new RuntimeException("Exception in work()");
}
public static void main(String[] args) {
try {
writingWithARM();
} catch (IOException e) {
e.printStackTrace();
}
try (AutoClose autoClose = new AutoClose()) {
autoClose.work();
} catch (Exception e) {
e.printStackTrace();
}finally {
System.out.println("123 = " + 123);
}
}
private static void writingWithARM() throws IOException {
try (DataOutputStream out
= new DataOutputStream(new FileOutputStream("data"));
) {
out.writeInt(666);
out.writeUTF("Hello");
}
}
}
java.lang.RuntimeException: Exception in work()
at com.xiaobu.test.daily.autoCloseAble.AutoClose.work(AutoClose.java:20)
at com.xiaobu.test.daily.autoCloseAble.AutoClose.main(AutoClose.java:25)
Suppressed: java.lang.RuntimeException: Exception in close()
at com.xiaobu.test.daily.autoCloseAble.AutoClose.close(AutoClose.java:14)
at com.xiaobu.test.daily.autoCloseAble.AutoClose.main(AutoClose.java:26)
>>> work()
>>> close()
123 = 123
可以看出先执行try块里面的代码,然后再关闭在try里面声明的资源,多个资源用;隔开
Socket、OutputStream、InputStream和sql Connection在JDK7之后都实现了AutoCloseAble接口。
示例:
try (
FileOutputStream out = new FileOutputStream("output");
FileInputStream in1 = new FileInputStream(“input1”);
FileInputStream in2 = new FileInputStream(“input2”)
) {
// Do something useful with those 3 streams!
} // out, in1 and in2 will be closed in any case