- try-with-resources 是個(gè)語法糖,實(shí)際上就是自動(dòng)調(diào)用資源的 close() 函數(shù)
try(RandomAccessFile randomAccessFile = new RandomAccessFile("/Users/linyuan/a.txt","rw")){
randomAccessFile.write("abcd".getBytes());
} catch (Exception e) {
e.printStackTrace();
}
- try 語句多了個(gè)括號(hào),這種在 try 后面加個(gè)括號(hào),再初始化對(duì)象的語法就叫 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();
}
}
編繹器自動(dòng)在 try-with-resources 后面增加了判斷對(duì)象是否為 null,不為 null 則調(diào)用 close() 函數(shù)
只有實(shí)現(xiàn)了 java.lang.AutoCloseable 或 java.io.Closable 接口的對(duì)象才會(huì)自動(dòng)調(diào)用 close() 函數(shù)
上面代碼編譯器會(huì)為我們生成代碼
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();
}
- 可以發(fā)現(xiàn)還有一個(gè) Throwable.addSuppressed 的調(diào)用,當(dāng)使用 try-with-resources 語句之后,有可能會(huì)出現(xiàn)兩個(gè)異常:
- 一個(gè)是 try 塊里的異常
- 一個(gè)是調(diào)用 close 函數(shù)里拋出的異常
- 如果 close 函數(shù)時(shí)出現(xiàn)異常,那么前面的異常就被成為 Suppressed Exceptions,因此 Throwable 有個(gè) addSuppressed 方法可以將它們保存起來,當(dāng)用戶捕捉到 close() 異常時(shí),就可以調(diào)用 Throwable.getSuppressed 方法取出之前的異常了