ARM - Quản lý tài nguyên tự động (Được giới thiệu từ Java 7)
Lấy một ví dụ rất đơn giản
static String readFirstLineFromFileWithFinallyBlock(String path)
throws IOException {
BufferedReader br = new BufferedReader(new FileReader(path));
try {
return br.readLine();
} finally {
if (br != null) br.close();
}
}
Bây giờ nếu readLine()
hàm ném Ngoại lệ và sau đó close()
hàm chẵn [trong khối cuối cùng] ném ngoại lệ thì cái sau được ưu tiên hơn và được ném trở lại hàm đang gọi. Trong trường hợp này,Exception thrown by the readLine() method is ignored/suppressed
. Bạn có thể liên kết ngoại lệ gây ra ngoại lệ trong ngoại lệ của mình và lặp lại ngoại lệ từ khối cuối cùng.
Vì java 7
chức năng đã được cung cấp để truy xuất các Ngoại lệ bị chặn. Bạn có thể gọi public final java.lang.Throwable[] getSuppressed()
hàm trên đối tượng có thể ném được đã bắt để xem các Ngoại lệ bị triệt tiêu.
Ví dụ:
static String readFirstLineFromFileWithFinallyBlock(String path)
throws Exception {
try (BufferedReader br = new BufferedReader(new FileReader(path));) {
return br.readLine();
}
}
Bây giờ nếu br.readLine();
dòng ném Exception1
và sau đó cho phép nói Exception2
được ném ra trong khi đóng tài nguyên [Hãy tưởng tượng điều này xảy ra trong một khối cuối cùng ngầm định mà câu lệnh try-with-resource tạo ra] thì Exception1 loại bỏ Exception2.
Một số điểm cần lưu ý ở đây -
- Nếu khối try-with-resource ném ra ngoại lệ, tức là trong khi tài nguyên khởi tạo thì khối try sẽ không thực thi và cùng một ngoại lệ sẽ được ném ra.
- Nếu việc khởi tạo tài nguyên thành công, hãy thử khối ném một ngoại lệ và ngoại lệ được ném ra trong khi đóng tài nguyên thì ngoại lệ được ném ra trong khi đóng tài nguyên sẽ bị loại bỏ bởi ngoại lệ được ném từ khối thử.
- Nếu bạn cung cấp khối cuối cùng rõ ràng và ngoại lệ được ném từ khối đó, nó sẽ ngăn chặn tất cả các ngoại lệ khác. (Khối cuối cùng rõ ràng này thực thi sau khi tài nguyên bị đóng)
Tôi đã biên soạn hầu hết các tình huống có thể xảy ra với các đoạn mã và đầu ra trong bài đăng sau.
Đã loại bỏ các ngoại lệ trong java 7
Hy vọng rằng sẽ giúp.