자원 닫기는 클라이언트가 놓치기 쉬워 예측할 수 없는 성능 문제로 이어지기도 함. finalizer는 믿을 수 없으므로 자원이 제대로 닫힘을 보장하는 방법이 필요함
디버깅을 어렵게 만든다.
BufferedReader br = new BufferedReader(new FileReader(path));
try{
return br.readLine();
} finally{
br.close();
}
readLine()에서 예외를 던지게 되면, close()또한 실패하게 됨 (finally는 무조건 실행되므로)
→ 첫번째 예외가 두번째 예외에 의해 가려짐
자원이 2개 이상이 되면 코드가 복잡해진다.
InptStream in = new FileInputStream(src);
try{
OutputStream out = new FileOutputStream(dst);
try{
byte[] buf = new byte[SIZE];
~~
}
finally{
out.close();
}
}
finally{
in.close();
}
public static String firstLineOfFile(String path) throw IOException {
try (BufferedReader br = new BufferedReader(new FileReader(path))) {
return br.readLine();
} catch (Exception e) {
return defaultVal;
}
}
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);
}
}
try-with-resources를 사용하면 close를 알아서 호출해줌
readLine과 close에서 예외가 발생하면 close에서 발생한 예외는 숨겨지고 첫 번째 예외가 기록됨
→ 숨겨진 예외들은 스택 추적 내역에 suppressed 꼬리표를 달고 출력됨
두 개 이상의 자원이 있을 때도 짧게 작성할 수 있음
이 구조를 사용하기 위해서는 해당 자원이 AutoCloseable 인터페이스를 구현해야 함