uokadaの見逃し三振は嫌いです

ここで述べられていることは私の個人的な意見に基づくものであり、私が所属する組織には一切の関係はありません。

JavaのAutoCloseableを使ってみた

【Java】try-with-resources構文について - TASK NOTES

Java7 AutoCloseableを使ってスマートにリソース解放する - ほげにっき

import java.io.IOException;

public class App {

    public static void main(String[] args) {
        try (JCLOSEFile jcloseFile = new JCLOSEFile()) {
            jcloseFile.getX();
        } catch (IOException e) {
             e.printStackTrace();
        }
    }

    public static class JCLOSEFile implements AutoCloseable {

        public void getX() throws IOException {
            System.out.println("throw exception from getX");
            throw new IOException("my exception");
        }

        @Override
        public void close() throws IOException {
            System.out.println("close Method is Called!");
            throw new IOException("from close method");
        }
    }
}
% <Java>
throw exception from getX
close Method is Called!
java.io.IOException: my exception
    at io.github.yuokada.App$JCLOSEFile.getX(App.java:19)
    at io.github.yuokada.App.main(App.java:9)
    Suppressed: java.io.IOException: from close method
        at io.github.yuokada.App$JCLOSEFile.close(App.java:25)
        at io.github.yuokada.App.main(App.java:10)

出力結果を確認するとgetX() から例外を投げられて呼び出されたclose()メソッドからも例外が投げられてます。
それをcatch節で捕まえてます。SuppressedExceptionsにはclose()から投げられた例外がセットされています。

簡単に全ての例外を捕まえられるのでAutoCloseableは使っていきたいですね。

やっぱり、実際に実装すると理解が深まりますね。