try-with-resource理解和使用

背景

在日常開發(fā)中,經(jīng)常都是手動(dòng)關(guān)閉資源刊橘,比如IO流鄙才,數(shù)據(jù)庫(kù)連接等。如果忘關(guān)了就可能造成嚴(yán)重的性能后果促绵。

try-finally帶來的問題

1攒庵、代碼不優(yōu)雅

手動(dòng)關(guān)閉IO流,特別是使用多個(gè)時(shí)败晴,finally方法里寫的嵌套代碼真的是不堪入目浓冒,下面看一個(gè)例子:

 public static void main(String[] args) {
 
        BufferedInputStream inputStream = null;
        BufferedOutputStream outputStream = null;
        try {
            inputStream = new BufferedInputStream(new FileInputStream("t1.txt"));
            outputStream = new BufferedOutputStream(new FileOutputStream("t2.txt"));
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                inputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                try {
                    outputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
 
            }
        }
    }

因?yàn)橐WCinputStream和outputStream都要正常關(guān)閉,所以往往會(huì)選擇嵌套著寫尖坤。

如果finally寫成下面那樣:

public static void main(String[] args) {
 
        BufferedInputStream inputStream = null;
        BufferedOutputStream outputStream = null;
        try {
            inputStream = new BufferedInputStream(new FileInputStream("t1.txt"));
            outputStream = new BufferedOutputStream(new FileOutputStream("t2.txt"));
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                inputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                outputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

當(dāng)inputStream.close(); 出現(xiàn)異常了稳懒,就不會(huì)再運(yùn)行 outputStream.close();了,就會(huì)一直無法釋放資源慢味。

2场梆、異常屏蔽問題

當(dāng)我們想向上層throws異常時(shí),由于只能拋出一個(gè)異常纯路,所以下面例子中或油,inputStream的異常就被outStream屏蔽了。

控制臺(tái)只顯示outStream的異常:


894512e0b76343dfad5496735360c9e0_tplv-k3u1fbpfcp-watermark.png

活用try-with-resource

Java 7后引人 try-with-resources驰唬,幫助我們快速解決資源釋放顶岸。

上述代碼使用try-with-resource,是不是優(yōu)雅了很多=斜唷辖佣!

public static void main(String[] args) {
        try (
                BufferedInputStream inputStream = new BufferedInputStream(new FileInputStream("t1.txt"));
                BufferedOutputStream outputStream = new BufferedOutputStream(new FileOutputStream("t2.txt"));
        ) {
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

其實(shí)try-with-resource的原理就是幫我們自動(dòng)補(bǔ)全close,下面是編譯后的class搓逾,和我們try-finally寫的是大同小異凌简。

public static void main(String[] args) {
        try {
            BufferedInputStream inputStream = new BufferedInputStream(new FileInputStream("t1.txt"));
 
            try {
                BufferedOutputStream outputStream = new BufferedOutputStream(new FileOutputStream("t2.txt"));
                outputStream.close();
            } catch (Throwable var5) {
                try {
                    inputStream.close();
                } catch (Throwable var4) {
                    var5.addSuppressed(var4);
                }
 
                throw var5;
            }
 
            inputStream.close();
        } catch (Exception var6) {
            var6.printStackTrace();
        }
 
    }
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市恃逻,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌藕施,老刑警劉巖寇损,帶你破解...
    沈念sama閱讀 218,122評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異裳食,居然都是意外死亡矛市,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門诲祸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來浊吏,“玉大人而昨,你說我怎么就攤上這事≌姨铮” “怎么了歌憨?”我有些...
    開封第一講書人閱讀 164,491評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)墩衙。 經(jīng)常有香客問我务嫡,道長(zhǎng),這世上最難降的妖魔是什么漆改? 我笑而不...
    開封第一講書人閱讀 58,636評(píng)論 1 293
  • 正文 為了忘掉前任心铃,我火速辦了婚禮,結(jié)果婚禮上挫剑,老公的妹妹穿的比我還像新娘去扣。我一直安慰自己,他們只是感情好樊破,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,676評(píng)論 6 392
  • 文/花漫 我一把揭開白布愉棱。 她就那樣靜靜地躺著,像睡著了一般捶码。 火紅的嫁衣襯著肌膚如雪羽氮。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,541評(píng)論 1 305
  • 那天惫恼,我揣著相機(jī)與錄音档押,去河邊找鬼。 笑死祈纯,一個(gè)胖子當(dāng)著我的面吹牛令宿,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播腕窥,決...
    沈念sama閱讀 40,292評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼粒没,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了簇爆?” 一聲冷哼從身側(cè)響起癞松,我...
    開封第一講書人閱讀 39,211評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎入蛆,沒想到半個(gè)月后响蓉,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,655評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡哨毁,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,846評(píng)論 3 336
  • 正文 我和宋清朗相戀三年枫甲,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,965評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡想幻,死狀恐怖粱栖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情脏毯,我是刑警寧澤闹究,帶...
    沈念sama閱讀 35,684評(píng)論 5 347
  • 正文 年R本政府宣布,位于F島的核電站抄沮,受9級(jí)特大地震影響跋核,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜叛买,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,295評(píng)論 3 329
  • 文/蒙蒙 一砂代、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧率挣,春花似錦刻伊、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至动漾,卻和暖如春丁屎,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背旱眯。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工晨川, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人删豺。 一個(gè)月前我還...
    沈念sama閱讀 48,126評(píng)論 3 370
  • 正文 我出身青樓共虑,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親呀页。 傳聞我的和親對(duì)象是個(gè)殘疾皇子妈拌,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,914評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容