꼭 회수해야 하는 자원은 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 문을 중첩하지 않고도 다수의 예외를 처리할 수 있다.