스터디/이펙티브 자바

[Effective Java] Item 9. try-finally보다는 try-with-resource

📝 작성 : 2022.05.15  ⏱ 수정 : 
728x90

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메서드를 통해 프로그램 코드로 가져올 수도 있습니다.

반응형