Винятки, кинуті в остаточному блоці, придушують виняток, кинутий раніше у блоці спробу або лову.
Приклад 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-resource. У наведеному вище прикладі виключення може бути викинуто з блоку спробу, і до двох винятків може бути викинуто з оператора спробу використання ресурсів, коли він намагається закрити об'єкти ZipFile та BufferedWriter. Якщо виняток викидається з блоку спробу і один або більше винятків викидаються з оператора try-with-ресурси, то винятки, викинуті з оператора try-with-ресурси, придушуються, а виняток, кинутий блоком, є одним що викидається методом writeToFileZipFileContents. Ви можете отримати ці придушені винятки, зателефонувавши методу Throwable.getSuppression з винятку, викинутого блоком спробу.
У коді з питання кожен блок очевидно відкидає старий виняток, навіть не записуючи його, що не добре, коли ви намагаєтеся вирішити деякі помилки:
http://en.wikipedia.org/wiki/Error_hiding