try-finally
static String firstLineOfFile(String path) throws IOException {
BufferedReader br = new BufferedReader(new FileReader(path));
try {
return br.readLine();
} finally {
br.close();
}
}
예외는 try와 finally 두 곳에서 발생할 수 있습니다.
예를들어서 기기에 물리적인 문제가 생긴다면 readLine()에서 예외를 던지고 close()또한 실패할 것입니다.
이 경우 close()에서 터진 예외가 readLine()의 예외를 완전히 집어삼켜서 해당 예외의 정보는 남지 않습니다.
물론, 두번째 예외(close()의 예외) 대신 첫번째 예외(readLine()의 예외)의 정보를 기록하도록 코드를 수정할 수 있지만 코드가 너무 지저분해집니다.
try-with-resource
AutoCloseable인터페이스를 구현해서 try-with-resource를 사용할 수 있도록 합니다.
static String firstLineOfFile(String path) throws IOException {
try (BufferedReader br = new BufferedReader(new FileReader(path))) {
return br.readLine();
}
}
이 경우 위에서 문제되었던 close()에서도 예외가 터지는 문제가 발생했을 때 자동적으로 close()예외는 숨겨지고 readLine()의 예외가 기록됩니다.
이 숨겨진 예외는 스택 추적 내역에 suppressed
라는 꼬리표를 달고 출력됩니다. 이는 Throwable의 getSuppressed메서드를 통해 프로그램 코드로 가져올 수도 있습니다.
반응형
'스터디 > 이펙티브 자바' 카테고리의 다른 글
[Effective Java] Item11. equals재정의시 무조건 hashCode도 재정의 (0) | 2022.05.21 |
---|---|
[Effective Java] Item10. equals는 일반 규약을 지켜 재정의 (0) | 2022.05.21 |
[Effective Java] Item 8. finalizer와 cleaner 사용을 피하라. (0) | 2022.05.15 |
[Effective Java] Item 7. 다 쓴 객체를 참조 해제하라. (0) | 2022.05.15 |
[Effective Java] Item 6. 불필요한 객체 생성을 피하라 (0) | 2022.05.15 |