Bài học theo mô-đun (2/2)
Tài nguyên dùng thử
Trong các phiên bản Java cũ hơn, việc quản lý các tài nguyên yêu cầu đóng rõ ràng (chẳng hạn như tệp, kết nối cơ sở dữ liệu hoặc luồng mạng) yêu cầu khối finally bắt buộc để đảm bảo chúng đã được đóng. Điều này dẫn đến mã dài dòng và dễ bị rò rỉ.
Java 7 đã giới thiệu câu lệnh try-with-resources, đảm bảo tự động đóng tất cả các tài nguyên được khai báo trong khối try, miễn là chúng triển khai giao diện AutoCloseable.
Cú pháp
Tài nguyên được khai báo và khởi tạo bên trong dấu ngoặc đơn ngay sau từ khóa try.
try (BufferedReader br = new BufferedReader(new FileReader("file.txt"))) {
String line = br.readLine();
System.out.println(line);
} catch (IOException e) {
System.out.println("I/O Error: " + e.getMessage());
}
// br is closed automatically here, even if an exception occursKhai báo nhiều tài nguyên
Bạn có thể khởi tạo nhiều tài nguyên bên trong cùng một khối try, phân tách chúng bằng dấu chấm phẩy ;. Các tài nguyên sẽ được đóng theo thứ tự ngược lại với khai báo của chúng.
try (
FileReader fr = new FileReader("input.txt");
FileWriter fw = new FileWriter("output.txt")
) {
// Use resources
} catch (IOException e) {
System.out.println("Error: " + e.getMessage());
}Tạo tài nguyên tùy chỉnh
Bạn có thể sử dụng tài nguyên tùy chỉnh trong khối try-with-resources miễn là nó triển khai java.lang.AutoCloseable và ghi đè phương thức close().
public class DatabaseConnection implements AutoCloseable {
public void query(String sql) {
System.out.println("Running query: " + sql);
}
@Override
public void close() {
System.out.println("Connection closed!");
}
}Hãy tự mình thử
Hoàn thành phương thức readFile bằng cách sử dụng câu lệnh try-with-resources để khởi tạo BufferedReader gói FileReader trên đường dẫn. Trong khối bắt, chặn IOException và in 'Lỗi đọc tệp'.
Hiển thị gợi ý
Khai báo `BufferedReader` trong ngoặc đơn ngay sau `try` và triển khai xử lý `IOException`.
Giải pháp khả dụng sau 3 lần thử
Khởi tạo tài nguyên tùy chỉnh CustomResource bên trong khối try-with-resources, gọi phương thức doWork() trên đó và xử lý Ngoại lệ bằng cách in 'Lỗi'.
Hiển thị gợi ý
Sử dụng `try (CustomResource res = new CustomResource())` và gọi `res.doWork();` bên trong nó.
Giải pháp khả dụng sau 3 lần thử
Khai báo cả FirstResource và SecondResource trong cùng một cấu trúc try-with-resource. Xử lý ngoại lệ bằng cách in 'Lỗi'.
Hiển thị gợi ý
Tách phần khai báo của hai tài nguyên bên trong dấu ngoặc đơn của `try` bằng dấu chấm phẩy `;`.
Giải pháp khả dụng sau 3 lần thử