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がオススメ!同僚に差をつけよう!