try-with-resources文はAutoCloseableインターフェースをimplementsしたクラスをtry句の引数に指定することで利用できる機能です。
AutoCloseableインターフェースの抽象メソッドclose()を適切にoverrideしていると、try-catch-resourcesを抜けた際に自動的に実行されます。
この記事では、try-with-resources文においてExceptionが発生した場合の処理順序について見ていきます。
サンプルコードの実行
この記事のサンプルではAutoCloseableをimplementsした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.javaのclose()を実行し、「The cat sits.」を表示。
↓
DogRun.javaのclose()を実行し、「The dog sits.」を表示。
↓
Main.javaの8行目で「Exception dog」を表示。
となります。
つまり、どこかの処理でthorwした時点で、AutoCloseableのクローズ機構が発動することになります。closeの処理順序は、try句の内側のクラスから順に実行されるためCatWalk.javaのclose()→DogRun.javaのclose()の順になります。

以上で記事の解説はお終い!
もっとJavaやSpringを勉強したい方にはUdemyがオススメ!同僚に差をつけよう!
頭脳一式 
