finally 블록에서 발생한 예외는 try 또는 catch 블록에서 이전에 발생한 예외를 억제합니다.
Java 7 예 : http://ideone.com/0YdeZo
에서 자바 독의 예 :
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 메소드는 finally 블록에서 발생한 예외를 처리합니다. try 블록에서 발생한 예외는 억제됩니다.
try-with
Java 7 의 새로운 구문은 예외 억제의 또 다른 단계를 추가합니다. try 블록에서 발생한 예외는 try-with 부분에서 이전에 발생한 예외를 억제합니다.
같은 예에서 :
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 문과 관련된 코드 블록에서 예외가 발생할 수 있습니다. 위의 예에서, try 블록에서 예외가 발생 될 수 있으며 ZipFile 및 BufferedWriter 객체를 닫으려고 할 때 try-with-resources 문에서 최대 2 개의 예외가 발생 될 수 있습니다. try 블록에서 예외가 발생하고 try-with-resources 문에서 하나 이상의 예외가 발생하면 try-with-resources 문에서 발생 된 예외가 억제되고 블록에서 발생한 예외는 예외입니다. 이것은 writeToFileZipFileContents 메소드에 의해 발생합니다. try 블록에서 발생한 예외에서 Throwable.getSuppressed 메소드를 호출하여 이러한 억제 된 예외를 검색 할 수 있습니다.
문제의 코드에서 각 블록은 오래된 예외를 무시하고 로깅조차하지 않으며 버그를 해결하려고 할 때 좋지 않습니다.
http://en.wikipedia.org/wiki/Error_hiding