国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

try-with-resource

edagarli / 1139人閱讀

摘要:三及其之后的資源關閉方式確實,在以前,沒有自動關閉外部資源的語法特性,直到中新增了語法,才實現了這一功能。四總結當一個外部資源的句柄對象實現了接口,中便可以利用語法更優雅的關閉資源,消除板式代碼。

一、背景
我們知道,在Java編程過程中,如果打開了外部資源(文件、數據庫連接、網絡連接等),我們必須在這些外部資源使用完畢后,手動關閉它們。因為外部資源不由JVM管理,無法享用JVM的垃圾回收機制,如果我們不在編程時確保在正確的時機關閉外部資源,就會導致外部資源泄露,緊接著就會出現文件被異常占用,數據庫連接過多導致連接池溢出等諸多很嚴重的問題。

二、傳統的資源關閉方式
為了確保外部資源一定要被關閉,通常關閉代碼被寫入finally代碼塊中,當然我們還必須注意到關閉資源時可能拋出的異常,于是變有了下面的經典代碼:

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);
            }
        }
    }
}

熟悉其他語言的朋友可能會開始吐槽了,在C++中,我們可以把關閉資源的代碼放在析構函數中,在C#中,我們有using代碼塊。這些語法都有一個共同的特性,讓外部資源的關閉行為與外部資源的句柄對象的生命周期關聯,當外部資源的句柄對象生命周期終結時(例如句柄對象已出作用域),外部資源的關閉行為將被自動調用。這樣不僅更加符合面向對象的編程理念(將關閉外部資源的行為內聚在外部資源的句柄對象中),也讓代碼更加簡潔易懂。怎么到了Java這里,就找不到自動關閉外部資源的語法特性了呢。

三、JDK7及其之后的資源關閉方式
確實,在JDK7以前,Java沒有自動關閉外部資源的語法特性,直到JDK7中新增了try-with-resource語法,才實現了這一功能。

那什么是try-with-resource呢?簡而言之,當一個外部資源的句柄對象(比如FileInputStream對象)實現了AutoCloseable接口,那么就可以將上面的板式代碼簡化為如下形式:

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);
    }
}

將外部資源的句柄對象的創建放在try關鍵字后面的括號中,當這個try-catch代碼塊執行完畢后,Java會確保外部資源的close方法被調用。代碼是不是瞬間簡潔許多!

3.2 實現原理
try-with-resource并不是JVM虛擬機的新增功能,只是JDK實現了一個語法糖,當你將上面代碼反編譯后會發現,其實對JVM虛擬機而言,它看到的依然是之前的寫法:

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 異常抑制
通過反編譯的代碼,大家可能注意到代碼中有一處對異常的特殊處理:

var2.addSuppressed(var11);

這是try-with-resource語法涉及的另外一個知識點,叫做異常抑制。當對外部資源進行處理(例如讀或寫)時,如果遭遇了異常,且在隨后的關閉外部資源過程中,又遭遇了異常,那么你catch到的將會是對外部資源進行處理時遭遇的異常,關閉資源時遭遇的異常將被“抑制”但不是丟棄,通過異常的getSuppressed方法,可以提取出被抑制的異常。

四、總結
1、當一個外部資源的句柄對象實現了AutoCloseable接口,JDK7中便可以利用try-with-resource語法更優雅的關閉資源,消除板式代碼。

2、try-with-resource時,如果對外部資源的處理和對外部資源的關閉均遭遇了異常,“關閉異常”將被抑制,“處理異常”將被拋出,但“關閉異常”并沒有丟失,而是存放在“處理異常”的被抑制的異常列表中。

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/73933.html

相關文章

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

    捕獲和處理異常 本節描述如何使用三個異常處理程序組件 — try、catch和finally塊 — 來編寫異常處理程序,然后,解釋了Java SE 7中引入的try-with-resources語句,try-with-resources語句特別適用于使用Closeable資源的情況,例如流。 本節的最后一部分將介紹一個示例,并分析各種場景中發生的情況。 以下示例定義并實現名為ListOfNumbe...

    Yujiaao 評論0 收藏0
  • 優秀代碼的必知必會(一)?

    摘要:但由于模式本身有嚴重的缺陷,由于構造方法在多次調用中被分割,導致可能處于不一致的狀態,并且還需要額外增加工作以確保線程安全。方法必須遵從類指定的常規約定,將不同的哈希碼分配給不同的實例對象。 1.使用靜態工廠方法替代構造方法 靜態工廠方法的優點: 不像構造方法,它是有名字的。 它不需要每次調用時都創建一個新對象。 它可以返回 其返回類型的任何子類型的對象。 返回對象的類可以根...

    ChanceWong 評論0 收藏0
  • 淺析Java異常處理機制

    摘要:關于異常處理的文章已有相當的篇幅,本文簡單總結了的異常處理機制,并結合代碼分析了一些異常處理的最佳實踐,對異常的性能開銷進行了簡單分析。是程序正常運行中,可以預料的意外情況,應該被捕獲并進行相應處理。 關于異常處理的文章已有相當的篇幅,本文簡單總結了Java的異常處理機制,并結合代碼分析了一些異常處理的最佳實踐,對異常的性能開銷進行了簡單分析。博客另一篇文章《[譯]Java異常處理的最...

    NSFish 評論0 收藏0
  • JAVA基礎

    摘要:當方法被重寫時,通常有必要重寫方法,以維護方法的常規協定,該協定聲明相等對象必須具有相等的哈希碼。如實現一個哈希表,為了成功地在哈希表中存儲和檢索對象,用作鍵的對象必須實現方法和方法。必須保證相等的對象也相等,因為哈希表通過檢索對象。 概念 修飾符:private,僅只能在設置了該權限的類中訪問,利用這個訪問權限,表現出封裝思想。default,默認的訪問權限,也是可以省略的訪問權限,...

    0xE7A38A 評論0 收藏0
  • Java 異常處理的 9 個最佳實踐

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

    sihai 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<