블로그에 게시하는 위 글은 전체적인 내용 정리가 아닌
책을 읽으면서 새로 알게된 내용이나 제가 중요하다고 생각하는 내용을 정리한 글입니다.
close()를 하지 않으면 예측하지 못한 이슈를 일으키기도 한다.
(대안으로 finalizer를 사용하긴 하지만 좋은 방법은 아니다. [아이템8])
close()를 사용해야하는 대표적인 자원들은 아래와 같다.
close()를 할 수 있는 전통적인 방법
단일 자원이면 상관 없지만, close()를 해야하는 자원이 여러 개면 코드가 더러워진다.
InputStream inputStream = new FileInputStream("src1"); // 첫 번째 InputStream
try {
InputStream inputStream2 = new FileInputStream("src2"); // 두 번째 InputStream
try {
// something ...
} finally {
inputStream2.close();
}
} finally {
inputStream.close();
}
뿐만 아니라 finally
블록에서 처리를 하다가 예외가 발생하면,
그 이전의 예외를 찾을 수 없다.
이걸 사용하려면 자원이 AutoCloseable 인터페이스를 구현해야한다.
(대부분의 자바 라이브러리, 서드파티 라이브러리는 구현이 되어있다.)
만약 close()해야하는 자원이 있으면 AutoCloseable을 구현해야한다.
try(InputStream inputStream = new FileInputStream("src1"); // 첫 번째 InputStream
nInputStream inputStream2 = new FileInputStream("src2")){ // 두 번째 InputStream
//something...
}
훨씬 깔끔하고 간결해졌을뿐만 아니라 예외 트래킹도 수월하다.
또한 여기서도 catch절을 쓸 수 있다.
try(InputStream inputStream = new FileInputStream("src1"); // 첫 번째 InputStream
nInputStream inputStream2 = new FileInputStream("src2")){ // 두 번째 InputStream
//something...
} catch(Exception e){
//something...
}