Các ngoại lệ được ném vào khối cuối cùng sẽ loại bỏ ngoại lệ được ném trước đó trong khối thử hoặc bắt.
Ví dụ về Java 7: http://ideone.com/0YdeZo
Từ ví dụ của Javadoc :
static String readFirstLineFromFileWithFinallyBlock(String path)
throws IOException {
BufferedReader br = new BufferedReader(new FileReader(path));
try {
return br.readLine();
} finally {
if (br != null) br.close();
}
}
Tuy nhiên, trong ví dụ này, nếu các phương thức readLine và đóng cả hai ngoại lệ, thì phương thức readFirstLineFromFileWithFinallyBlock sẽ ném ngoại lệ được ném từ khối cuối cùng; ngoại lệ được ném từ khối thử bị triệt tiêu.
try-with
Cú pháp mới của Java 7 bổ sung thêm một bước loại bỏ ngoại lệ: Các ngoại lệ được ném trong khối thử sẽ loại bỏ các lỗi được ném trước đó trong phần dùng thử.
từ cùng một ví dụ:
try (
java.util.zip.ZipFile zf = new java.util.zip.ZipFile(zipFileName);
java.io.BufferedWriter writer = java.nio.file.Files.newBufferedWriter(outputFilePath, charset)
) {
for (java.util.Enumeration entries = zf.entries(); entries.hasMoreElements();) {
String newLine = System.getProperty("line.separator");
String zipEntryName = ((java.util.zip.ZipEntry)entries.nextElement()).getName() + newLine;
writer.write(zipEntryName, 0, zipEntryName.length());
}
}
Một ngoại lệ có thể được ném ra từ khối mã được liên kết với câu lệnh try-with-resource. Trong ví dụ trên, một ngoại lệ có thể được ném ra khỏi khối thử và có thể ném tối đa hai ngoại lệ từ câu lệnh try-with-resource khi nó cố gắng đóng các đối tượng ZipFile và BufferedWriter. Nếu một ngoại lệ được ném từ khối thử và một hoặc nhiều ngoại lệ được ném ra từ câu lệnh try-with-resource, thì những ngoại lệ đó được ném ra từ câu lệnh try-with-resource bị loại bỏ và ngoại lệ được ném bởi khối đó là ngoại lệ được ném bởi phương thức writeToFileZipFileContents. Bạn có thể truy xuất các ngoại lệ bị loại bỏ này bằng cách gọi phương thức throwable.getSuppressed từ ngoại lệ được ném bởi khối thử.
Trong mã từ câu hỏi, mỗi khối đều loại bỏ ngoại lệ cũ, thậm chí không đăng nhập nó, không tốt khi bạn đang cố gắng giải quyết một số lỗi:
http://en.wikipedia.org/wiki/Error_hiding