Java SE 7 이후에 추가됨
resource는 프로그램이 종료된 이후 반드시 close되어야 하는 객체를 의미한다. try-with-resources를 사용하면 각각의 리소스가 close되는 것을 보장한다.
- 모든 리소스는
java.lang.AutoCloseable인터페이스를 구현해야 한다. - 리소스는
try블럭의 성공 여부에 상관 없이close된다. - 리소스는
catch,finally블럭이 실행되기 전에close된다.
하나의 리소를 선언하는 예제:
try (BufferedReader br = new BufferedReader(new FileReader(path))) {
return br.readLine();
}
두개의 리소스를 선언하는 예제:
;를 구분자로 사용해서 한개 이상의 리소스를 선언할 수 있다.close가 되는 순서는 변수가 생성되는 순서의 반대다.
try (
java.util.zip.ZipFile zf = new java.util.zip.ZipFile(zipFileName);
java.io.BufferedWriter writer = java.nio.file.Files.newBufferedWriter(outputFilePath, charset)
) {
...
}
위 코드에서 writer > zf 순으로 close가 호출된다.
Suppressed Exceptions
try 블럭에서 예외 A가 발생한 뒤 리소스를 close하는 과정에서 예외 B가 발생하면, 예외 B는 무시된다. 이 때, 예외 A의 Throwable.getSuppressed 메소드를 사용해서 예외 B를 조회할 수 있다.
AutoClosable and Closeable
각각의 문서를 통해 상속받는 인터페이스와 구현체를 확인할 수 있다.
- AutoClosable은
Exception을 던진다. - Closeable은
AutoCloseable을 상속받아서IOException을 던진다.