Try with resources

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는 무시된다. 이 때, 예외 AThrowable.getSuppressed 메소드를 사용해서 예외 B를 조회할 수 있다.

AutoClosable and Closeable

각각의 문서를 통해 상속받는 인터페이스와 구현체를 확인할 수 있다.

  • AutoClosableException을 던진다.
  • CloseableAutoCloseable을 상속받아서 IOException을 던진다.