こんにちは!
スタッフ19号です!
今回はJavaの例外処理についてお話ししたいなと思います。
まずは、Javaの例外の種類について分かりやすい図があったのでお借りします。
https://itsakura.com/java-kensa-reigai
https://java.keicode.com/lang/exceptions.php
さらに、よく出てくる例外の種類の表もあったので、それもお借りします。
https://java.keicode.com/lang/exceptions.php
上記のように例外は、例外処理を必ず行わなければいけないものと、行わないものの2種類に分けられます。
この記事では例外処理が必要なものの基本的な書き方について書いていきたいと思います!
基本的なtry-catch文
例外処理を行うにはtry-catch文を使用します。
try-catchの書き方の例
//例外が発生しなかったらこの中の処理をすべて行う
try {
例外が発生する可能性のある処理。
//例外が発生した場合、例外発生箇所よりもあとのtryブロック内の処理は実行されず、catchブロック内の処理が実行される
} catch(Exception e) {
エラー(Exceptionクラスの例外)が発生した場合の処理
}
これが基本的な書き方になります。
ただし、tryの中でエラーが発生した場合はエラーが発生した後の処理が実行されません。必ず実行させたい処理がある場合は、「finally」ブロックを作成します。
finallyの中に記載した処理は例外が起きても、起きなくても最後に必ず実行されます。
finallyの書き方の例
try {
// 例外が発生する可能性のある処理
} catch(Exception e) {
// エラーが発生した場合の処理
} finally {
// 必ず最後に実行する処理(tryの中にreturnがあってもあっても、finallyの処理は実行される)
}
複数の例外をキャッチ
tryブロック内の処理に対して、複数の例外を定義できます。
複数例外キャッチの書き方
try {
// 例外が発生する可能性のある処理
} catch(IOException e) {
System.out.println("IOExceptionが発生しました。");
} catch(Exception e) {
System.out.println("Exceptionが発生しました。");
} finally {
// 必ず最後に実行する処理
}
このとき、例外の継承関係に注意が必要です。
たとえば、IOExceptionはExceptionを継承しているため、IOExceptionのインスタンスはExceptionとして扱うこともできます。
なので、IOExceptionよりも先にExceptionのcatchを書いてしまうと、IOExceptionが発生したとしても、Exceptionの中のcatchブロックの処理が実行されてしまい、コンパイルエラーが発生します。
また、複数の例外をキャッチして、同じ処理を行うこともできます。
例
try {
// 例外が発生する可能性のある処理
//複数の例外を「|」で区切ってまとめてキャッチする
} catch(IOException | NullPointerException e) {
System.out.println("IOExceptionかNullPointerExceptionが発生しました。");
} catch(Exception e) {
System.out.println("何かしらのエラーが発生しました。");
}finally {
// 必ず最後に実行する処理
}
になります!
例外処理についてはもっとたくさんのやり方がありますが、今回は基本ということでこのくらいで。
またタイミングがあったら他の例外処理方法についても書きたいと思います!
では、スタッフ19号でした。