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