Search
Duplicate

아이템 09 - try-finally 보다는 try-with-resources를 사용하라

작성자
챕터
2장 - 객체 생성과 파괴
최종 편집
2023/09/13 12:39
생성 시각
2023/07/11 01:00

try-with-resources

try-with-resources
try-finally 의 문제점을 상당 부분 해결함
이 구조를 사용하려면 해당 자원이 AutoCloseable 인터페이스를 구현해야 함
try 블록을 벗어날 때 (자원을 회수하는) close 메서드가 자동으로 호출됨
try 문에서 실행한 코드와 close 메서드 호출 양쪽에서 예외가 발생하면, close 메서드에서 발생한 예외는 숨겨지고, try 문에서 발생한 예외가 기록되기 때문에 디버깅이 수월해진다.
위에서 숨겨진 예외도 stack trace에 '숨겨졌다'는 꼬리표를 달고 출력된다.
catch 절을 같이 쓸 수 있다.
try-finally 문의 문제점
1.
자원을 여러 개 사용하는 경우에 코드가 지저분해진다.
2.
try 문에서 예외가 발생하고, finally 문에서도 예외가 발생하였을 경우, 두 번째 예외가 첫 번째 예외를 완전히 집어삼키게 되기 때문에 stack trace에 첫 번째 예외에 관한 정보가 남지 않아서 디버깅이 어려워진다.
Autocloseable 인터페이스
close 메서드를 호출해 직접 닫아줘야 하는 자원을 나타내는 인터페이스
void 반환 타입의 close 메서드 하나만 정의되어 있는 인터페이스
예제 코드
import item2.builderPattern.Job; public class TryWithResources { public static void makeDeveloper() { try (Job job = new Job.Builder("developer", 50000000) .setWorkingHours(8).setVacationDays(15).build()) { System.out.println("makeDeveloper"); } catch (Exception e) { e.printStackTrace(); } } }
Java
복사