1. 程式人生 > >3.Try-with-resources in Java 7

3.Try-with-resources in Java 7

try..with..resources是java7的一種新的異常處理機制,能夠很容易的使用try…catch塊正確關閉資源回收.

對於有資源回收管理的異常處理方式,老式學校的處理:

private static void printFile() throws IOException {
    InputStream input = null;

    try {
        input = new FileInputStream("file.txt");//1

        int data = input.read();//2
        while(data != -1){
            System.out
.print((char) data); data = input.read();//3 } } finally { if(input != null){ input.close();//4 } } }

有4處地方容易發生異常,你可以看到,三處在try塊,1處在finally塊.finally塊總是會執行,不管try塊是否有異常丟擲,這意味著, inputstream是會關閉的或者說試圖關閉.
inputstream的close() 方法意味著也會丟擲異常,如果關閉失敗了. 想象一下異常從try塊跑出來,finally塊會執行.當異常衝finally塊丟擲的時候,這個異常會不會上拋給訪問棧?
從finally塊丟擲的異常會傳播給訪問棧,即使try塊的異常可能是更相關的傳播。

try-with-resources
在java7你能寫試用try-with-resource結構的程式碼來改造上面的案例:


private static void printFileJava7() throws IOException {

    try(FileInputStream input = new FileInputStream("file.txt")) {

        int data = input.read();
        while(data != -1){
            System.out.print((char) data);
            data = input.read();
        }
    }
}

注意第一行,這裡的try-with-resources結構, 變數FileInputStream被宣告在大括號裡面,另外一FileInputStream是一個例項分配給一個變數.
當try塊執行完成,FileInputStream將自動關閉.這是因為FileInputStream實現了java.lang.AutoCloseable介面.所有實現該介面的類都可以放在try-with-resources結構中.

如果一個異常從try-with-resources塊中丟擲,fileinputstream已經關閉了,try塊中丟擲的異常將拋到外層.異常會被抑制.這剛好和開頭的案例相反(使用舊有異常處理).

使用多個資源
也可以使用try-with-resources塊處理多個資源:

private static void printFileJava7() throws IOException {

    try(  FileInputStream     input         = new FileInputStream("file.txt");
          BufferedInputStream bufferedInput = new BufferedInputStream(input)
    ) {

        int data = bufferedInput.read();
        while(data != -1){
            System.out.print((char) data);
    data = bufferedInput.read();
        }
    }
}

這個案例建立了兩個資源通過try關鍵字後面的括號. FileInputStream 和 BufferedInputStream.兩個資源都會在執行流離開try塊後自動關閉.
資源會通過反向初始化順序的關閉, BufferedInputStream 先關閉, FileInputStream後關閉.

自定義可關閉資源的實現
使用try-with-resources結構不僅僅適用於java內建類.也能通過實現java.lang.autocloseable介面實現自己類使用.
下面是AutoCloseable介面:


public interface AutoClosable {

    public void close() throws Exception;
}

public class MyAutoClosable implements AutoCloseable {

    public void doIt() {
        System.out.println("MyAutoClosable doing it!");
    }

    @Override
    public void close() throws Exception {
        System.out.println("MyAutoClosable closed!");
    }
}

private static void myAutoClosable() throws Exception {

    try(MyAutoClosable myAutoClosable = new MyAutoClosable()){
        myAutoClosable.doIt();
    }
}

//console output
MyAutoClosable doing it!
MyAutoClosable closed!

你可以看到,try-with-resources是一個十分強大的方式確保使用在try-catch中的資源能正常關閉,不管這個資源時自己建立的還是java自帶的元件.
譯者:如果使用者在使用一個類似於事務處理的業務時,可以通過實現該介面,完成一致性處理.

相關推薦

3.Try-with-resources in Java 7

try..with..resources是java7的一種新的異常處理機制,能夠很容易的使用try…catch塊正確關閉資源回收. 對於有資源回收管理的異常處理方式,老式學校的處理: private static void printFile() throw

Java 7 Try-With-Resources

前言 最近在看程式碼的時候發現了IO流怎麼都不需要自己手動關閉的呢,還以為是別人忘記關。結果一問,尷尬了。這居然是Java 7 的新特性。因此,特地的記錄下來了。 1. try-with-resources是什麼來的? try-with-resources,就是Java 7中的新特性之

Java 7中的Try-with-resources

原文連結 作者:Jakob Jenkov 譯者:fangqiang08([email protected]) Try-with-resources是java7中一個新的異常處理機制,它能夠很容易地關閉在try-catch語句塊中使用的資源。 利用Try-Catch-Finally管

java 7新特性-TWR(Try-with-resources)

今天在資料上練習檔案拷貝程式時,遇到了java 7中的一個新特性TWR,可以減少實際中的部分程式碼書寫,對其做以記錄。 try-with-resources語句是聲明瞭一個或多個資源的try語句塊。在

Java 代碼字節:足智多謀的 Try-With-Resources

調用 兩個 java 創建 現在 總結 fin 修改 throwable 當通過 Java 實現業務實例時,對資源進行處理是司空見慣的。一般情況下,資源(如文件或 socket 句柄)封裝在對象中,使用後必須關閉才能釋放資源。通常開發人員有責任關閉自己所創建的資源,以避免資

JDK1.7新特性--try-with-resources

簡介 try-with-resources語句是一個宣告一個或多個資源的try語句。 資源是一個物件,必須在程式完成後關閉它。 try-with-resources語句確保在語句結束時關閉每個資源。 實現java.lang.AutoCloseable的任何物件(包括實現java.io.C

java中的AutoCloseable介面與try with resources

try-with-resources引入的背景 很多Java程式都需要操作一些資源,如檔案、流(streams)、套接字(sockets)和資料庫連線(database connections)。操作這些資源的時候得很小心,因為它們操作的時候獲取了作業系統的資源。所以你得保證,即使在發生

Java 程式碼位元組 : Try-With-Resources

當通過 Java 實現業務例項時,對資源進行處理是司空見慣的。一般情況下,資源(如檔案或 socket 控制代碼)封裝在物件中,使用後必須關閉才能釋放資源。通常開發人員有責任關閉自己所建立的資源,以避免資源衝突,一般都會放在 finally 語句塊中處理。不這樣做其實也不會產生編譯錯誤,但很容易導致

Java 程式碼位元組:足智多謀的 Try-With-Resources

當通過 Java 實現業務例項時,對資源進行處理是司空見慣的。一般情況下,資源(如檔案或 socket 控制代碼)封裝在物件中,使用後必須關閉才能釋放資源。通常開發人員有責任關閉自己所建立的資源,以避免資源衝突,一般都會放在 finally 語句塊中處理。不這樣做其實也不會

Java基礎學習總結(136)——有關流資源關閉(try-with-resources與AutoCloseable)的使用總結

前言 做Java開發的都知道,每個資源的開啟都需要對應的關閉操作,不然就會使資源一直佔用而造成資源浪費,從而降低系統性能。關於資源的關閉操作,從JDK7-JDK9有了不少的提升及簡化。我們來看看資源處理的變化。 一、JDK6 在JDK6及之前,每個資源都需要我們手動寫程

Effective Java 第三版讀書筆記——條款9:使用 try-with-resources 語句替代 try-finally 語句

Java 類庫中包含許多必須手動呼叫 close 方法來關閉的資源, 比如InputStream、OutputStream 和 java.sql.Connection。 從以往來看,try-finally 語句是保證資源正確關閉的最佳方式,即使是在程式丟擲異常或

Java SE7新特性之try-with-resources語句

 try-with-resources語句是一個宣告一個或多個資源的 try 語句。一個資源作為一個物件,必須在程式結束之後隨之關閉。 try-with-resources語句確保在語句的最後每個資源都被關閉 。任何實現了 java.lang.Aut

java遺珠之try-with-resources

try-with-resources語句自動關閉實現了AutoCloseable或者 Closeable介面的資源,示例如下: public static void writeToFileZipFile

Redis分布式鎖的try-with-resources實現

故障 rgs 是不是 str .exe stat 等於 通過 except Redis分布式鎖的try-with-resources實現 一、簡介 在當今這個時代,單體應用(standalone)已經很少了,java提供的synchronized已經不能滿足需求,大家自然

Java7 新特性: try-with-resources

Try-with-resources是java7中一個新的異常處理機制,它能夠很容易地關閉在try-catch語句塊中使用的資源。 利用Try-Catch-Finally管理資源(舊的程式碼風格)在java7以前,程式中使用的資源需要被明確地關閉,這個體驗有點繁瑣。 下面的方法讀取檔案,然後用System

think in java--7.10初始化及類載入的理解

1.在java中每個類都會編譯成一個獨立得檔案。該檔案只會在程式需要使用的時候才載入。可以說:類得程式碼在初次使用的時候才會載入。還有,當訪問static域或者方法時候,也會發生載入。初次使用之處也是static載入發生之處,所有的static物件和static方法都會在載入時按照程式順序載入,定義

Python 版的 try-with-resources -- with 上下文管理器

作為一個  Java 為母語的程式設計師來講,學習起其他新的語言就難免任何事都與 Java 進行橫向對比。Java 7 引入了能省去許多重複程式碼的 try-with-resources 特性,不用每回 try/finally 來釋放資源(不便之處有區域性變數必須宣

java8學習第二篇:try-with-resources

Java8裡的一個新語法特性:try-with-resources。 這個語法特性其實從java7裡就有了,不過java8的sample裡依然有這個。 try-with-resources的特性就是,在try( ...)裡宣告的資源,會在try-catch程式碼塊結束後自

TimSort in Java 7

Superpippo 發表於 2012-09-25 1. 為什麼寫這篇文章 這篇文章的根源是在產品中發現了一個詭異的bug:只能在產品環境下重現,在我的本地開發環境無法重現,而雙方的程式碼沒有任何區別。最後用remote debug的方法找到異常所在: Exc

Python 版的 try-with-resources——with 上下文管理器!

作為一個 Java 為母語的程式設計師來講,學習起其他新的語言就難免任何事都與 Java 進行橫向對比。Java 7 引入了能省去許多重複程式碼的 try-with-resources 特性,不用每回 try/finally 來釋放資源(不便之處有區域性變數必須宣告在 try 之前,finally