亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專(zhuān)欄INFORMATION COLUMN

try-with-resource

edagarli / 1186人閱讀

摘要:三及其之后的資源關(guān)閉方式確實(shí),在以前,沒(méi)有自動(dòng)關(guān)閉外部資源的語(yǔ)法特性,直到中新增了語(yǔ)法,才實(shí)現(xiàn)了這一功能。四總結(jié)當(dāng)一個(gè)外部資源的句柄對(duì)象實(shí)現(xiàn)了接口,中便可以利用語(yǔ)法更優(yōu)雅的關(guān)閉資源,消除板式代碼。

一、背景
我們知道,在Java編程過(guò)程中,如果打開(kāi)了外部資源(文件、數(shù)據(jù)庫(kù)連接、網(wǎng)絡(luò)連接等),我們必須在這些外部資源使用完畢后,手動(dòng)關(guān)閉它們。因?yàn)橥獠抠Y源不由JVM管理,無(wú)法享用JVM的垃圾回收機(jī)制,如果我們不在編程時(shí)確保在正確的時(shí)機(jī)關(guān)閉外部資源,就會(huì)導(dǎo)致外部資源泄露,緊接著就會(huì)出現(xiàn)文件被異常占用,數(shù)據(jù)庫(kù)連接過(guò)多導(dǎo)致連接池溢出等諸多很?chē)?yán)重的問(wèn)題。

二、傳統(tǒng)的資源關(guān)閉方式
為了確保外部資源一定要被關(guān)閉,通常關(guān)閉代碼被寫(xiě)入finally代碼塊中,當(dāng)然我們還必須注意到關(guān)閉資源時(shí)可能拋出的異常,于是變有了下面的經(jīng)典代碼:

public static void main(String[] args) {
    FileInputStream inputStream = null;
    try {
        inputStream = new FileInputStream(new File("test"));
        System.out.println(inputStream.read());
    } catch (IOException e) {
        throw new RuntimeException(e.getMessage(), e);
    } finally {
        if (inputStream != null) {
            try {
                inputStream.close();
            } catch (IOException e) {
                throw new RuntimeException(e.getMessage(), e);
            }
        }
    }
}

熟悉其他語(yǔ)言的朋友可能會(huì)開(kāi)始吐槽了,在C++中,我們可以把關(guān)閉資源的代碼放在析構(gòu)函數(shù)中,在C#中,我們有using代碼塊。這些語(yǔ)法都有一個(gè)共同的特性,讓外部資源的關(guān)閉行為與外部資源的句柄對(duì)象的生命周期關(guān)聯(lián),當(dāng)外部資源的句柄對(duì)象生命周期終結(jié)時(shí)(例如句柄對(duì)象已出作用域),外部資源的關(guān)閉行為將被自動(dòng)調(diào)用。這樣不僅更加符合面向?qū)ο蟮木幊汤砟睿▽㈥P(guān)閉外部資源的行為內(nèi)聚在外部資源的句柄對(duì)象中),也讓代碼更加簡(jiǎn)潔易懂。怎么到了Java這里,就找不到自動(dòng)關(guān)閉外部資源的語(yǔ)法特性了呢。

三、JDK7及其之后的資源關(guān)閉方式
確實(shí),在JDK7以前,Java沒(méi)有自動(dòng)關(guān)閉外部資源的語(yǔ)法特性,直到JDK7中新增了try-with-resource語(yǔ)法,才實(shí)現(xiàn)了這一功能。

那什么是try-with-resource呢?簡(jiǎn)而言之,當(dāng)一個(gè)外部資源的句柄對(duì)象(比如FileInputStream對(duì)象)實(shí)現(xiàn)了AutoCloseable接口,那么就可以將上面的板式代碼簡(jiǎn)化為如下形式:

public static void main(String[] args) {
    try (FileInputStream inputStream = new FileInputStream(new File("test"))) {
        System.out.println(inputStream.read());
    } catch (IOException e) {
        throw new RuntimeException(e.getMessage(), e);
    }
}

將外部資源的句柄對(duì)象的創(chuàng)建放在try關(guān)鍵字后面的括號(hào)中,當(dāng)這個(gè)try-catch代碼塊執(zhí)行完畢后,Java會(huì)確保外部資源的close方法被調(diào)用。代碼是不是瞬間簡(jiǎn)潔許多!

3.2 實(shí)現(xiàn)原理
try-with-resource并不是JVM虛擬機(jī)的新增功能,只是JDK實(shí)現(xiàn)了一個(gè)語(yǔ)法糖,當(dāng)你將上面代碼反編譯后會(huì)發(fā)現(xiàn),其實(shí)對(duì)JVM虛擬機(jī)而言,它看到的依然是之前的寫(xiě)法:

public static void main(String[] args) {
    try {
        FileInputStream inputStream = new FileInputStream(new File("test"));
        Throwable var2 = null;

        try {
            System.out.println(inputStream.read());
        } catch (Throwable var12) {
            var2 = var12;
            throw var12;
        } finally {
            if (inputStream != null) {
                if (var2 != null) {
                    try {
                        inputStream.close();
                    } catch (Throwable var11) {
                        var2.addSuppressed(var11);
                    }
                } else {
                    inputStream.close();
                }
            }

        }

    } catch (IOException var14) {
        throw new RuntimeException(var14.getMessage(), var14);
    }
}

3.3 異常抑制
通過(guò)反編譯的代碼,大家可能注意到代碼中有一處對(duì)異常的特殊處理:

var2.addSuppressed(var11);

這是try-with-resource語(yǔ)法涉及的另外一個(gè)知識(shí)點(diǎn),叫做異常抑制。當(dāng)對(duì)外部資源進(jìn)行處理(例如讀或?qū)懀r(shí),如果遭遇了異常,且在隨后的關(guān)閉外部資源過(guò)程中,又遭遇了異常,那么你catch到的將會(huì)是對(duì)外部資源進(jìn)行處理時(shí)遭遇的異常,關(guān)閉資源時(shí)遭遇的異常將被“抑制”但不是丟棄,通過(guò)異常的getSuppressed方法,可以提取出被抑制的異常。

四、總結(jié)
1、當(dāng)一個(gè)外部資源的句柄對(duì)象實(shí)現(xiàn)了AutoCloseable接口,JDK7中便可以利用try-with-resource語(yǔ)法更優(yōu)雅的關(guān)閉資源,消除板式代碼。

2、try-with-resource時(shí),如果對(duì)外部資源的處理和對(duì)外部資源的關(guān)閉均遭遇了異常,“關(guān)閉異常”將被抑制,“處理異?!睂⒈粧伋觯瓣P(guān)閉異?!辈](méi)有丟失,而是存放在“處理異?!钡谋灰种频漠惓A斜碇?。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/73933.html

相關(guān)文章

  • Java? 教程(捕獲和處理異常)

    捕獲和處理異常 本節(jié)描述如何使用三個(gè)異常處理程序組件 — try、catch和finally塊 — 來(lái)編寫(xiě)異常處理程序,然后,解釋了Java SE 7中引入的try-with-resources語(yǔ)句,try-with-resources語(yǔ)句特別適用于使用Closeable資源的情況,例如流。 本節(jié)的最后一部分將介紹一個(gè)示例,并分析各種場(chǎng)景中發(fā)生的情況。 以下示例定義并實(shí)現(xiàn)名為L(zhǎng)istOfNumbe...

    Yujiaao 評(píng)論0 收藏0
  • 優(yōu)秀代碼的必知必會(huì)(一)?

    摘要:但由于模式本身有嚴(yán)重的缺陷,由于構(gòu)造方法在多次調(diào)用中被分割,導(dǎo)致可能處于不一致的狀態(tài),并且還需要額外增加工作以確保線(xiàn)程安全。方法必須遵從類(lèi)指定的常規(guī)約定,將不同的哈希碼分配給不同的實(shí)例對(duì)象。 1.使用靜態(tài)工廠(chǎng)方法替代構(gòu)造方法 靜態(tài)工廠(chǎng)方法的優(yōu)點(diǎn): 不像構(gòu)造方法,它是有名字的。 它不需要每次調(diào)用時(shí)都創(chuàng)建一個(gè)新對(duì)象。 它可以返回 其返回類(lèi)型的任何子類(lèi)型的對(duì)象。 返回對(duì)象的類(lèi)可以根...

    ChanceWong 評(píng)論0 收藏0
  • 淺析Java異常處理機(jī)制

    摘要:關(guān)于異常處理的文章已有相當(dāng)?shù)钠?,本文?jiǎn)單總結(jié)了的異常處理機(jī)制,并結(jié)合代碼分析了一些異常處理的最佳實(shí)踐,對(duì)異常的性能開(kāi)銷(xiāo)進(jìn)行了簡(jiǎn)單分析。是程序正常運(yùn)行中,可以預(yù)料的意外情況,應(yīng)該被捕獲并進(jìn)行相應(yīng)處理。 關(guān)于異常處理的文章已有相當(dāng)?shù)钠?,本文?jiǎn)單總結(jié)了Java的異常處理機(jī)制,并結(jié)合代碼分析了一些異常處理的最佳實(shí)踐,對(duì)異常的性能開(kāi)銷(xiāo)進(jìn)行了簡(jiǎn)單分析。博客另一篇文章《[譯]Java異常處理的最...

    NSFish 評(píng)論0 收藏0
  • JAVA基礎(chǔ)

    摘要:當(dāng)方法被重寫(xiě)時(shí),通常有必要重寫(xiě)方法,以維護(hù)方法的常規(guī)協(xié)定,該協(xié)定聲明相等對(duì)象必須具有相等的哈希碼。如實(shí)現(xiàn)一個(gè)哈希表,為了成功地在哈希表中存儲(chǔ)和檢索對(duì)象,用作鍵的對(duì)象必須實(shí)現(xiàn)方法和方法。必須保證相等的對(duì)象也相等,因?yàn)楣1硗ㄟ^(guò)檢索對(duì)象。 概念 修飾符:private,僅只能在設(shè)置了該權(quán)限的類(lèi)中訪(fǎng)問(wèn),利用這個(gè)訪(fǎng)問(wèn)權(quán)限,表現(xiàn)出封裝思想。default,默認(rèn)的訪(fǎng)問(wèn)權(quán)限,也是可以省略的訪(fǎng)問(wèn)權(quán)限,...

    0xE7A38A 評(píng)論0 收藏0
  • Java 異常處理的 9 個(gè)最佳實(shí)踐

    摘要:異常處理的個(gè)最佳實(shí)踐原文地址翻譯出處在中,異常處理是個(gè)很麻煩的事情。使用描述性消息拋出異常這個(gè)最佳實(shí)踐背后的想法與前兩個(gè)類(lèi)似。當(dāng)你以錯(cuò)誤的格式提供時(shí),它將被類(lèi)的構(gòu)造函數(shù)拋出。類(lèi)提供了特殊的構(gòu)造函數(shù)方法,它接受一個(gè)作為參數(shù)。 Java 異常處理的 9 個(gè)最佳實(shí)踐 原文地址:https://dzone.com/articles/9-...翻譯出處:https://www.oschina.n...

    sihai 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<