【Java入門】try-with-resourcesの処理順序

【Java入門】try-with-resourcesの処理順序

try-with-resources文はAutoCloseableインターフェースをimplementsしたクラスをtry句の引数に指定することで利用できる機能です。
AutoCloseableインターフェースの抽象メソッドclose()を適切にoverrideしていると、try-catch-resourcesを抜けた際に自動的に実行されます。
この記事では、try-with-resources文においてExceptionが発生した場合の処理順序について見ていきます。

サンプルコードの実行

この記事のサンプルではAutoCloseableimplementsしたDogRunクラスとCatWalkクラスの挙動について見ていきます。

DogRun.java

public class DogRun implements AutoCloseable {
    @Override
    public void close() throws Exception {
        System.out.println("The dog sits.");
    }

    public void run() throws Exception {
        System.out.println("Dog running...");
        throw new Exception("Exception dog");
    }

}

CatWalk.java

public class CatWalk implements AutoCloseable {
    @Override
    public void close() throws Exception {
        System.out.println("The cat sits.");
    }

    public void walk() throws Exception {
        System.out.println("Exception cat");
    }
}

Main.java

public static void main(String[] args) {
    try(DogRun DogRun = new DogRun();
        CatWalk CatWalk = new CatWalk()){
        DogRun.run();
        CatWalk.walk();} 
    catch (Exception e) {
        System.out.println(e.getMessage());
    }
}

【実行結果】
Dog running…
The cat sits.
The dog sits.
Exception dog

解説

Main.javaの4行目でDogRun.run()を実行。

DogRun.javaの8行目で「Dog running…」を表示。

DogRun.javaの9行目で例外をスロー。
↓ ここからAutoCloseableのオーバーライドしたcloseメソッドが順に処理されていくことになります。
CatWalk.javaclose()を実行し、「The cat sits.」を表示。

DogRun.javaclose()を実行し、「The dog sits.」を表示。

Main.javaの8行目で「Exception dog」を表示。

となります。
つまり、どこかの処理でthorwした時点で、AutoCloseableのクローズ機構が発動することになります。closeの処理順序は、try句の内側のクラスから順に実行されるためCatWalk.javaclose()DogRun.javaclose()の順になります。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です