陷阱忘記了免費資源

每次程式開啟資源(例如檔案或網路連線)時,一旦使用完資源,釋放資源非常重要。如果在對此類資源的操作期間丟擲任何異常,則應採取類似的謹慎措施。有人可能會說, FileInputStream 有一個終結器 ,可以在垃圾收集事件中呼叫 close() 方法; 但是,由於我們無法確定垃圾收集週期何時開始,因此輸入流可以無限期地消耗計算機資源。必須在 try-catch 塊的 finally 部分中關閉資源:

Version < Java SE 7

private static void printFileJava6() throws IOException {
    FileInputStream input;
    try {
        input = new FileInputStream("file.txt");
        int data = input.read();
        while (data != -1){
            System.out.print((char) data);
            data = input.read();
        }
    } finally {
        if (input != null) {
            input.close();
        }
    }
}

從 Java 7 開始,Java 7 中引入了一個非常有用且簡潔的語句,特別是針對這種情況,稱為 try-with-resources:

Version >= Java SE 7

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

試穿與資源語句可以使用實現 CloseableAutoCloseable 介面的任何物件使用。它確保在語句結束時關閉每個資源。兩個介面之間的區別在於,Closeableclose() 方法丟擲了一個必須以某種方式處理的 IOException

如果資源已經開啟但應該在使用後安全關閉,可以將其分配給 try-with-resources 中的區域性變數

Version >= Java SE 7

private static void printFileJava7(InputStream extResource) throws IOException {
    try (InputStream input = extResource) {
        ... //access resource
    }
}

在 try-with-resources 建構函式中建立的本地資源變數實際上是最終的。