try-catch-finally文とtry-with-resource文
どちらも例外処理を記述するための構文。
※例外処理とは
Javaの例外には、Error、Exception(検査例外)、RuntimeException(非検査例外)がある。
・Errorはプログラムでは対処できない問題(※コンパイルエラーとは異なり、あくまで例外)
・Exception(検査例外)は、例外発生時の処理を記述しないとコンパイルエラーが発生する問題
・RuntimeException(非検査例外)は、例外発生時の処理が任意の例外。
Exceptionのサブクラスなので、先にExceptionをキャッチするcatchブロックを書いたあとで、RuntimeExceptionをキャッチするcatchブロックを書くと、到達不能コードとなりコンパイルエラーが発生する
メソッドに例外を無視させる・メソッドから例外を発生させる
・throws : メソッド内で該当の例外が発生した場合、自信のメソッド内でcatchするのではなく、呼ばれる側に例外を投げる処理。検査例外をスローするメソッドは、throwsでスローする可能性を宣言しなくてはならない。
例)
public test() throws IndexOutOfBounsException {
//処理
}
→処理の過程でIndexOutOfBounsException が発生しても、testメソッドは無視。testメソッドを実行した側にIndexOutOfBoundsExceptionが発生する。
・throw : メソッドから例外を発生させる
例)
public test(){
throw new IndexOutOfWxception();
}
→testメソッドを実行すると、testメソッドにIndexOutOfWxception例外が発生する
try-catch-finally文
・tryブロック:例外が発生する可能性がある処理
・catchブロック:例外が発生した時の処理
・finallyブロック:どのような場合でも一番最後に実行する処理
【try-catch-finally文の例】
※return処理は、finally文の実行後に行われる
public class Main {
public static void main(String[] args){
System.out.println(test(null));
//finallyブロックの処理
//引数がnullです
//と表示される
System.out.println(test(10));
//引数の値は10
//finallyブロックの処理
//引数は有効でした
//と表示される
}
public static String test(Object obj){
try{
System.out.println("引数の値は" + obj.toString());
}catch(NullPointerException e){
return "引数がnullです";
}finally{
System.out.println("finallyブロックの処理");
}
return "引数は有効でした";
}
}
try-with-resource文
例外が発生した時に、自動的にリソースのcloseメソッドを呼び出して、リソースを解放する構文
・処理の実行順
①closeメソッドでリソースを解放する
②catchブロックの例外処理を行う
③finallyブロックの処理を行う
※例外処理よりも先にリソースの解放を行う
【try-with-resource文の例】
(Java Silver黒本より)
public class Main {
public static void main(String[] args){
try(Sample s = new Sample()){
throw new Exception(); //Exceptionを発生させる
}catch(Exception e){
System.out.println("A");
}finally{
System.out.println("B");
}
}
}
class Sample implements AutoCloseable{
public void close() throws Exception{
System.out.println("C"); //closeメソッド実行時にはCと表示される
}
}
↓
「C A B」と表示される。
closeメソッド→catchブロック→fianllyブロックの順に実行されるため
参考)
公式ドキュメント・AutoCloseableインターフェース
閉じられるまで、リソース(ファイルやソケット・ハンドルなど)を保持できるオブジェクト。
AutoCloseableオブジェクトのclose()メソッドは、リソース指定ヘッダーでそのオブジェクトが宣言されているtry-with-resourcesブロックの終了時に自動的に呼び出されます。
この構築によって即時解放が確保され、それ以外の場合に発生する可能性のあるリソース不足例外およびエラーを回避できます。