Skip to content

Latest commit

 

History

History
42 lines (27 loc) · 2.28 KB

File metadata and controls

42 lines (27 loc) · 2.28 KB

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

작성자: 박성민

작성일: 2022년 4월 16일


자바 라이브러리에는 InputStream, OutputStream, java.sql.Connection 등 close 메서드를 호출해 직접 닫아줘야 하는 자원이 많다. 그런데 클라이언트가 자원 닫기를 놓치는 경우가 있다.

전통적으로 자원을 닫을 때 try-finally가 쓰였다.

try-finally의 문제

  • 자원을 여러 개 사용하면 중첩 try-finally가 되어 쓰기도 어렵고, 읽기도 어렵다.
  • try안에서와 finally안에서 둘 다 예외가 터지면 try에서 예외가 터졌어도 finally가 실행되기 때문에 finally 에서 터진 예외가 try 에서 터진 예외를 완전히 집어 삼키게 된다. 그러면 스택 추적 내역에 첫 번째 예외에 관한 정보는 남지 않게 되어, 디버깅을 몹시 어렵게 한다.

try-with-resources

  • try-finally의 문제들이 자바 7부터 제공한 try-with-resources 덕에 모두 해결되었다.
  • 이 구조를 사용하려면 해당 자원이 AutoCloseable 인터페이스를 구현해야 한다. 자바 라이브러리와 서드파티 라이브러리들의 수많은 클래스와 인터페이스가 이미 AutoClosealble을 구현하거나 확장해뒀다. 자원을 닫아야 하는 클래스를 작성한다면 AutoCloseable을 반드시 구현하자.
static void copy(String src, String dst) throws IOException {
    try (InputStream in = new FileInputStream(src);
         OutputStream out = new FileOutputStream(dst)) {
        byte[] buf = new byte[BUFFER_SIZE];
        int n;
        while ((n = in.read(buf)) >= 0)
            out.write(buf, 0, n);
    }
}
  • try-with-resources 버전이 짧고 읽기 수월할 뿐 아니라 문제를 진단하기도 훨씬 좋다.
  • try 안에서 예외가 발생하고, close에서도 예외가 발생하면 close에서 발생한 예외는 숨겨지고 try에서 발생한 예외가 기록된다.

​ 숨겨진 예외들도 그냥 버려지지는 않고, 스택 추적 내역에 '숨겨졌다(suppressed)'는 꼬리표를 달 고 출력된다.

  • try-with-resources에서도 catch 절을 쓸 수 있다. catch 절 덕에 try 문을 더 중첩하지 않고도 다수의 예외를 처리할 수 있다.