Java 教程

Java 控制語句

面向物件程式設計

Java 內建類

Java 檔案處理

Java 錯誤和異常

Java 多執行緒

Java 同步

Java 網路

Java 集合

Java 介面

Java 資料結構

Java 集合演算法

高階 Java

Java 雜項

Java API 和框架

Java 類參考

Java 有用資源

Java - 帶資源的 try 語句



帶資源的 try 語句

Java 的 try-with-resources 語句是一個try 語句,用於宣告一個或多個資源,例如流、套接字、資料庫、連線等。這些資源必須在程式完成時關閉。try-with-resources 語句在語句結束時關閉資源。

try-with-resources 功能是在 Java7 中引入的。try-with-resources 也可以替代try-catch-finally 用於資源物件。

try-with-resources 語句也稱為“自動資源管理”,它是在 Java7 中引入的。如果您正在使用資源物件,則此語句可以替代 try-catch-finally 語句。

帶資源的 try 語句的語法

要使用此語句,您只需在括號內宣告所需的資源,並在塊結束時自動關閉建立的資源。以下是 try-with-resources 語句的語法

try(resources declarations) {
    // use of the resources
}
catch(Exception e) {
    // exception handling
}

例如,使用 try-with-resources 開啟檔案

try(FileReader fr = new FileReader("file path")) {
   // use the resource
   } catch () {
      // body of catch 
   }
}

以下程式使用 try-with-resources 語句讀取檔案中的資料。

示例:Java 中的帶資源的 try 語句

在此程式中,我們在 try with resources 語句中建立 FileReader 物件。FileReader fr,引用在 try 語句中宣告,我們不需要記住在 finally 塊中關閉它,因為它將由 JVM 自動關閉,因此不存在記憶體洩漏或連線丟失的可能性。

import java.io.FileReader;
import java.io.IOException;

public class Try_withDemo {

   public static void main(String args[]) {
      try(FileReader fr = new FileReader("E://file.txt")) {
         char [] a = new char[50];
         fr.read(a);   // reads the contentto the array
         for(char c : a)
         System.out.print(c);   // prints the characters one by one
      } catch (IOException e) {
         e.printStackTrace();
      }
   }
}

具有多個資源的帶資源的 try 語句

您還可以在 try 塊中宣告多個資源。請考慮以下示例:

// This example is to use Try with Resources 
// with multiple  Resources
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.PrintWriter;
import java.io.IOException;

public class Main {
  public static void main(String[] args) {
    // try block with multiple resources
    try (
      FileReader fileReader = new FileReader("file1.txt"); 
      BufferedReader bufferedReader = new BufferedReader(fileReader); 
      FileWriter fileWriter = new FileWriter("file2.txt"); 
      PrintWriter printWriter = new PrintWriter(fileWriter)
    ) {
      String line;
      while ((line = bufferedReader.readLine()) != null) {
        // Read content line by line and write it 
        // to the output (file2.txt) file
        printWriter.println(line);
      }
      System.out.println("Content copied.");
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
}

示例:不使用帶資源的 try 語句

在以下程式中,我們使用FileReader讀取檔案中的資料,並使用 finally 塊關閉它。在此程式中,我們在 try 塊中建立 FileReader 物件。FileReader fr,引用在 try 塊之外宣告,以便在 try 塊之外訪問它,我們需要記住在 finally 塊中或程式退出之前關閉它,以避免記憶體洩漏或連線丟失的可能性。

import java.io.File;
import java.io.FileReader;
import java.io.IOException;

public class ReadData_Demo {

   public static void main(String args[]) {
      FileReader fr = null;		
      try {
         File file = new File("file.txt");
         fr = new FileReader(file); char [] a = new char[50];
         fr.read(a);   // reads the content to the array
         for(char c : a)
         System.out.print(c);   // prints the characters one by one
      } catch (IOException e) {
         e.printStackTrace();
      }finally {
         try {
            fr.close();
         } catch (IOException ex) {		
            ex.printStackTrace();
         }
      }
   }
}

帶資源的 try 語句:要點

在使用 try-with-resources 語句時,請牢記以下幾點。

  • 要將類與 try-with-resources 語句一起使用,它必須實現AutoCloseable介面,並且其close()方法會在執行時自動呼叫。

  • 您可以在 try-with-resources 語句中宣告多個類。

  • 當您在 try-with-resources 語句的 try 塊中宣告多個類時,這些類將以相反的順序關閉。

  • 除了在括號內宣告資源之外,其他所有內容都與 try 塊的普通 try/catch 塊相同。

  • 在 try 塊開始之前,try 中宣告的資源會被例項化。

  • 在 try 塊中宣告的資源隱式宣告為 final。

Java 9 中帶資源的 try 語句的改進

在 Java 9 之前,資源需要在 try 之前或 try 語句內部宣告,如下面的示例所示。在此示例中,我們將使用 BufferedReader 作為資源來讀取字串,然後關閉 BufferedReader。

Java 9 之前

import java.io.BufferedReader;
import java.io.IOException;
import java.io.Reader;
import java.io.StringReader;

public class Tester {
   public static void main(String[] args) throws IOException {
      System.out.println(readData("test"));
   } 
   static String readData(String message) throws IOException {
      Reader inputString = new StringReader(message);
      BufferedReader br = new BufferedReader(inputString);
      try (BufferedReader br1 = br) {
         return br1.readLine();
      }
   }
}

輸出

讓我們編譯並執行上述程式,這將產生以下結果:

test

在這裡,我們需要在 try 語句中宣告一個資源 br1,然後使用它。在 Java9 中,我們不再需要宣告 br1,以下程式將給出相同的結果。

Java 9 及以後版本

import java.io.BufferedReader;
import java.io.IOException;
import java.io.Reader;
import java.io.StringReader;

public class Tester {
   public static void main(String[] args) throws IOException {
      System.out.println(readData("test"));
   } 
   static String readData(String message) throws IOException {
      Reader inputString = new StringReader(message);
      BufferedReader br = new BufferedReader(inputString);
      try (br) {
         return br.readLine();
      }
   }
}

輸出

讓我們編譯並執行上述程式,這將產生以下結果:

test
廣告