java try resource_从 Java 字节码角度看 try with resource 语法糖
Java 7中的 try-with-resource,在沒有這個語法糖的情況下的等價實現是什么?
以下面的demo為例,這個問題目測99%的人都寫不完全正確,不信來戰。
public static void foo() throws Exception {
try (AutoCloseable c = dummy()) {
bar();
}
}
public static void bar() {
// may throw exception
}
我們憑第一感覺來寫一下:
public static void foo() throws Exception {
AutoCloseable c = null;
try {
c = dummy();
bar();
} finally {
if (c != null) {
c.close();
}
}
}
看起來沒什么問題,但是仔細想一下,如果bar()拋出了異常e1,c.close()也拋出了異常e2,調用者會收到哪個呢?
我們來回顧一下Java基礎,try catch finally部分
public static void foo() {
try {
throw new RuntimeException("in try");
} finally {
throw new RuntimeException("in finally");
}
}
調用foo()函數最終會拋出什么異常呢?
運行一下:
Exception in thread "main" java.lang.RuntimeException: in finally
try中拋出的異常,就被finally中拋出的異常淹沒掉了。
回到剛剛的問題,如果 bar() 和 c.close()同時拋了異常,那么調用端應該會收到c.close()拋出的異常e2, 往往這并不是我們想要的。那么怎么樣拋出try中的異常,同時又不丟掉finally中的異常呢?
Java 7 中 為 Throwable 類 增 加 的 addSuppressed 方 法。當 一 個異 常 被 拋 出 的 時 候 , 可 能 有 其 他 異 常 因 為 該 異 常 而 被 抑 制 住 , 從 而 無 法 正 常 拋 出 。 這時 可 以 通 過addSuppressed 方 法 把 這 些 被 抑 制 的 方 法 記 錄 下 來 。 被 抑 制 的 異 常 會 出 現在 拋 出 的 異 常 的 堆 棧 信 息 中 , 也 可 以 通 過 getSuppressed 方 法 來 獲 取 這 些 異 常 。 這 樣做 的 好 處 是 不 會 丟 失 任 何 異 常 , 方 便 開 發 人 員 進 行 調 試 。
有了上述概念,我們進行改寫
```java
public static void foo() throws Exception {
AutoCloseable c = null;
Exception tmpException = null;
try {
c = dummy();
bar();
} catch (Exception e) {
tmpException = e;
throw e;
} finally {
if (c != null) {
if (tmpException != null) {
try {
總結
以上是生活随笔為你收集整理的java try resource_从 Java 字节码角度看 try with resource 语法糖的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java io 输出流_Java IO
- 下一篇: java课程设计总结迷宫_Java课程设