ข้อยกเว้นที่ถูกโยนเข้ามาในที่สุดบล็อกระงับข้อยกเว้นที่ถูกโยนก่อนหน้านี้ในลองหรือจับบล็อก
ตัวอย่าง Java 7: http://ideone.com/0YdeZo
จากตัวอย่างของ 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();
}
}
อย่างไรก็ตามในตัวอย่างนี้หากเมธอด readLine และปิดทั้งข้อยกเว้นการโยนดังนั้นเมธอด readFirstLineFromFileWithFinallyBlock จะโยนข้อยกเว้นที่ส่งออกจากบล็อกในที่สุด ข้อยกเว้นที่ส่งออกจากบล็อกการลองถูกระงับ
try-with
ไวยากรณ์ใหม่ของ Java 7 เพิ่มขั้นตอนการยกเว้นอีกขั้น: ข้อยกเว้นที่เกิดขึ้นในการลองบล็อกจะระงับสิ่งที่ถูกโยนก่อนหน้านี้ในส่วนลองกับ
จากตัวอย่างเดียวกัน:
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());
}
}
ข้อยกเว้นสามารถถูกส่งออกจากบล็อกของรหัสที่เกี่ยวข้องกับคำสั่งลองกับทรัพยากร ในตัวอย่างด้านบนข้อยกเว้นสามารถถูกส่งออกมาจากบล็อกการลองและสามารถยกเว้นได้ถึงสองข้อยกเว้นจากคำสั่ง try-with-resources เมื่อพยายามปิดวัตถุ ZipFile และ BufferedWriter หากข้อยกเว้นถูกส่งออกมาจากบล็อกการลองและข้อยกเว้นอย่างน้อยหนึ่งข้อถูกส่งออกไปจากคำสั่ง try-with-resources ดังนั้นข้อยกเว้นที่ส่งออกมาจากคำสั่ง try-with-resources จะถูกระงับและข้อยกเว้นการส่งออกโดยบล็อกจะเป็นข้อยกเว้น ที่ถูกโยนโดยเมธอด writeToFileZipFileContents คุณสามารถดึงข้อยกเว้นที่ถูกระงับเหล่านี้ได้โดยการเรียกใช้เมธอด Throwable.getSuppressed จากข้อยกเว้นที่ส่งออกมาโดยบล็อกการลอง
ในรหัสจากคำถามแต่ละบล็อกจะทิ้งข้อยกเว้นเก่า ๆ อย่างชัดเจนไม่ได้บันทึกมันไม่ดีเมื่อคุณพยายามที่จะแก้ไขข้อบกพร่องบางอย่าง:
http://en.wikipedia.org/wiki/Error_hiding