- try-with-resources 是个语法糖,实际上就是自动调用资源的 close() 函数
try(RandomAccessFile randomAccessFile = new RandomAccessFile("/Users/linyuan/a.txt","rw")){
randomAccessFile.write("abcd".getBytes());
} catch (Exception e) {
e.printStackTrace();
}
- try 语句多了个括号,这种在 try 后面加个括号,再初始化对象的语法就叫 try-with-resources,上面代码等同于
RandomAccessFile randomAccessFile = null;
try {
randomAccessFile = new RandomAccessFile("/Users/linyuan/a.txt","rw");
randomAccessFile.write("abcd".getBytes());
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (randomAccessFile != null)
randomAccessFile.close();
} catch (IOException e) {
e.printStackTrace();
}
}
-
编绎器自动在 try-with-resources 后面增加了判断对象是否为 null,不为 null 则调用 close() 函数
-
只有实现了 java.lang.AutoCloseable 或 java.io.Closable 接口的对象才会自动调用 close() 函数
-
上面代码编译器会为我们生成代码
try {
RandomAccessFile randomAccessFile = new RandomAccessFile("/Users/linyuan/a.txt", "rw");
Throwable var2 = null;
try {
randomAccessFile.write("abcd".getBytes());
} catch (Throwable var12) {
var2 = var12;
throw var12;
} finally {
if (randomAccessFile != null) {
if (var2 != null) {
try {
randomAccessFile.close();
} catch (Throwable var11) {
var2.addSuppressed(var11);
}
} else {
randomAccessFile.close();
}
}
}
} catch (Exception var14) {
var14.printStackTrace();
}
- 可以发现还有一个 Throwable.addSuppressed 的调用,当使用 try-with-resources 语句之后,有可能会出现两个异常:
- 一个是 try 块里的异常
- 一个是调用 close 函数里抛出的异常
- 如果 close 函数时出现异常,那么前面的异常就被成为 Suppressed Exceptions,因此 Throwable 有个 addSuppressed 方法可以将它们保存起来,当用户捕捉到 close() 异常时,就可以调用 Throwable.getSuppressed 方法取出之前的异常了
网友评论