[이펙티브 자바] try-finally 보다 try-with-resources 사용하자

꼭 회수해야 하는 자원은 try-with-resources를 사용하자

 

 

 

try-finally의 단점

우리는 자원의 닫힘을 보장하는 수단으로 try-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 {
    	in.close();
	}
}
  • 코드의 가독성이 떨어진다.
  • 두 번째 예외가 첫 번째 예외를 먹게되어, 첫 번째 예외에 관한 정보가 남아있지 않게 된다.
    물론 첫 번째 예외를 기록하도록 코드를 수정할 수 있지만, 코드는 더욱 지저분해질 것이다.

 

 

 

 

try-with-resources

  • 위 문제를 해결하기 위한 자바 7때 나옴
  • 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);
	}
}
  • 읽기 쉬워진다.
  • 보여줄 예외는 보여지고, 나머지 다른 예외가 숨겨질 수 있다. 이때 숨겨진 예외들도 버려지지 않고, 스택 추척 내역에 suppressed 꼬리표를 달고 출력된다.
  • try-with-resources에서도 catch 절을 쓸 수 있다. try 문을 중첩하지 않고도 다수의 예외를 처리할 수 있다.