얼마전에 작성했던 try-with-resources의 대한 내용이 책에서도 나오는것을 보면 많이 사용되는 개념인것 같다. 앞서
try-with-resources 예외 처리
여기서 설명했지만 각설하고 다시 정리해보도록 하자
자바의 InputStream, OutputStream, java.sql.Connection 등은 close 메서드를 통하여 자원을 닫아야 한다. 하지만 클라이언트가 놓치기 쉽고 이는 성능 문재로 이어진다. 안정망으로 finalizer를 사용한다만, 아이템 8의 내용처럼 그리 믿을만 하지 않다.
public static String firstLineOfFile(String path) throws IOException {
BufferedReader br = new BufferedReader(new FileReader(path));
try {
return br.readLine();
} finally {
br.close();
}
}
위 코드는 close 메서드를 이용해 자원을 해제주는 코드로 나쁘지 않아 보이지만 자원의 사용이 많아질 경우 코드가 지저분해지고 실수를 유발할 가능성이 높아진다.
public class Copy {
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 블록과 finally 블록 모두 발생할 수 있으나 마지막 예외가 모든 예외를 덮어 버리게 되고 이는 디버깅을 어렵게할 것이다.
앞선 문제들은 try-with-resources등장 이후 해결되었다.
static String firstLineOfFile(String path) throws IOException {
try (BufferedReader br = new BufferedReader(
new FileReader(path))) {
return br.readLine();
}
}
이렇게 회수해야할 자원을 try 구문에 써주게 된다면 자원을 자동으로 닫아주고 앞선 덮여진 예외의 디버깅등 상당히 편리해 졌으며, 숨겨진 예외의 경우도 무시가 되지 않고 숨겨졌다는 메시지로 출력된다.