로마
-
try-with-resource는 자바 7부터 추가된 기능. IO Stream, Connection과 같이 자원 해제가 필요한 경우 간단한 구문을 통해 자원 해제할 수 있게 된다.
-
자원이 Autocloseable 인터페이스를 구현해야한다.
-
여러 자원을 이렇게도 선언할 수 있다.
Connection conn = dataSource.getConnection(); PreparedStatement pstm = conn.prepareStatement(sql); try (conn; pstm) { setParams(statement, params); statement.execute(); } catch (final SQLException e) { throw new RuntimeException(e); }
try-with-resource의 장점?
- 기존 try-finally 사용 방식에 비해 간결하다.
- try-finally 버전
String firstLineOfFile(String path) trows IOException { BufferedReader br = new BufferedReader(new FilerReader(path)); try { return br.readLine(); } finally { br.close(); } }
- try-with-resource 버전
String firstLineOfFile(String path) trows IOException { try (BufferedReader br = new new BufferedReader(new FilerReader(path))){ return br.readLine(); } }
- 만들어지는 예외 정보가 유용하다.
- try-finally 에서 만일 물리적인 에러로 인해서 br.readLine과 br.close 모두 예외가 터질 경우 두 번째인 close의 예외가 readLine의 예외를 집어삼켜 버린다.
- 따라서 스택 추적 내역에 첫 번째 예외인 br.readLine과 관련된 정보는 남지 않게되어 디버깅이 어려워진다.
- try-with-resources에서는 양쪽에서 예외가 발생할 경우 readLine의 예외가 기록된다. 숨겨진예외도 버려지지 않고 suppressed(숨겨진) 라는 꼬리표를 달고 출력된다.
- try-finally 에서 만일 물리적인 에러로 인해서 br.readLine과 br.close 모두 예외가 터질 경우 두 번째인 close의 예외가 readLine의 예외를 집어삼켜 버린다.
- https://ryan-han.com/post/java/try_with_resources/
- 이펙티브 자바 아이템 9