[이펙티브 자바] 아이템9

hyng·2022년 11월 25일
0

이펙티브 자바

목록 보기
9/13

try-finally 보다는 try-with-resouces를 사용하라

반환해야 하는 자원은 대부분 finalizer를 활용하고 있지만 finalizer는 적절한 방법이 아니다. (아이템 8)
그래서 전통적으로 많이 사용되어 온 것이 try-finally이다.


파일에서 한 줄을 읽고 자원을 반환하는 코드이다. 그런데 br.readLine()과 br.close() 모두에서 예외가 발생하게 된다면 어떻게 될까?

두 번째 예외가 첫 번째 예외를 삼키게 된다. 그러면 스택 추적 내역에는 두 번째 예외만 남으므로 디버깅이 어렵게 된다. (두 번째 예외 대신 첫 번째 예외를 기록하도록 코드를 수정할 수는 있지만, 코드가 너무 지저분해져서 그렇게까지 하는 경우는 거의 없다.)
그리고 자원이 두개 이상만 돼도 코드가 너무 지저분하다.

지금은 throws을 사용해서 예외를 던지기 때문에 그나마 낫지만 이 코드가 없다면 아래처럼 엄청나게 지저분해진다.

try-with-resources 를 사용해보자

try-with-resouces를 사용하기 위해서는 해당 자원이 AutoCloseable 인터페이스를 구현해야한다.

코드가 훨씬 간결해졌다. 그리고 readLine(내부에서 호출되는) 과 close 모두에서 예외가 발생하더라도 close에서 발생한 예외는 숨겨지고 readLine에서 발생한 예외가 기록된다. 숨겨진 예외들도 스택 추적 내역에 suppressed 꼬리표를 달고 출력된다.

try-catch대신 try-with-resources를 사용하자. 코드는 더 짧고 분명해지고, 만들어지는 예외 정보도 훨씬 유용하다.

profile
공부하고 알게 된 내용을 기록하는 블로그

0개의 댓글