Effective Java | #9. try-finally보다는 try-with-resources를 사용하라

보람·2022년 5월 12일
0

Effective-Java

목록 보기
10/25

close메서드를 이용한 자원 회수는 놓치기가 쉽다.

finalizer

  • 안전망으로 finalizer를 활용하나 믿을만하지 못함(item-8)

trt-finally

static void copy(String src, String dst) throws IOException {
    InputStream in = new FileInputStream(src);
    try {
        OutputStream out = new FileOutputStream(dst);
        try {
            byte[] buf = new byte[BUFFER_SIZE];
            int n;
            while ((n = in.read(buf)) >= 0)
                out.write(buf, 0, n);
        } finally {
            out.close();
        }
    } finally { //자원 두개를 회수하기 위해서 finally 두번 처리
        in.close();
    }
}
  • 제대로 닫힘을 보장하는 수단으로 많이 쓰임
  • finally 절에서 자원을 회수
  • 자원 둘 이상 닫아야 할 경우 지저분함
    • 예외는 try, finally 모두에서 일어날 수 있는데, try에서 예외 발생됐는데 finally에서도 예외가 발생됐다면 두 번째 예외가 첫 번째 예외를 집어삼켜 버린다.

try-with-resources를 사용하자

static String firstLineOfFile(String path, String defaultVal) {
    try (BufferedReader br = new BufferedReader(
            new FileReader(path))) {
        return br.readLine();
    } catch (IOException e) {
        return defaultVal;
    }
}
  • try-with-resouces : try 문에서 선언된 객체들에 대해서 try 종료시 자동으로 자원 해제
  • 가독성이 좋고 문제를 진단하기 좋음
  • catch 절을 추가하면 try문 중첩 없이 다수 예외 처리 가능
  • 정확하고 쉽게 자원 회수 가능

핵심 정리

  • 꼭 회수해야 하는 자원을 다룰 때는 try-finally 대신 try-with-resources를 사용
profile
백엔드 개발자

0개의 댓글