본문 바로가기
책 정리/이펙티브 자바

[이펙티브 자바] try-finally보다는 try-with-resources를 사용하라 - item 9

by chanwoodev 2023. 6. 22.

try-finalizer의 문제점

 

첫번째 예외가 덮어써지는 문제

static String sfirstLineOfFile(String path) IOException {
    BufferedReader br = new BufferedReader(new FileReader(path));
    try {
        return br.readLine();
    } finally {
        br.close();
    }
}

try 문 안의 readLine이 예외를 던지고 br.close가 예외를 던지면 readLine의 의 예외가 br.close의 예외에 덮어씌워짐

 

첫 번쨰 예외에 관한 정보가 남지 않게 되어 디버깅을 어렵게 만듬

 

둘 이상의 try-finally가 사용 시 코드의 가독성 문제

void method() {
    try {
    	try{
        	...
        } finally {
        	..
        }
    } finally {
    	...
    }
 
}

위의 코드형태는 굉장히 지저분함

 

try-with-resources를 사용하자!

static String firstLineOfFile(String path) throws IOException {
    try (BufferedReader br = new BufferedReader(new FileReader(path)) {
        return br.readLine();
    }
}
  • 자원이 AutoCloseable이 구현되어있다면 해당 방식을 사용할 수 있으며 try가 끝날 때 close 메서드가 실행된다
  • 복수의 자원을 처리하기에도 편하다
  • 예외가 덮어써지지 않는다
    • 스택 추적 내역에 (suppressed)라는 꼬리표를 달고 함께 출력된다