例外クラス
APIには、様々な例外的状況を表す例外クラスが用意されている 例外クラスを継承してオリジナルの例外クラスを定義できる
例外の種類
Error系 java.lang.Errorの子孫、回復の見込みがない致命的な状況を表すクラス (例)
- OutOfmemoryError(メモリ不足)
- ClassFormatError(クラスファイル破損)
Exception系 java.lang.Exceptionの子孫 発生を十分に想定して対処を考える必要がある例外的状況を表すクラス (例)
- IOException(ファイルが読み書きできない)
- ConnectExeption(ネットワーク接続不可)
RuntimeException (例)
- NullPointerExcepstion(変数がnull)
- ArrayIndexOutofBoundsException(配列の添え字が不正)
例外が発生した時の代替え処理
Exception系の例外が発生しそうな命令を呼び出す場合、 try-catch文を用いて「例外が発生した時の代替え処理」を 用意しておかないとコンパイルエラーとなる
スタックトレース
JVMがプログラムのメソッドを、どのような順序で 呼び出し、どこで例外が発生したか」 という経緯が記録された情報
例外のキャッチ
例外のキャッチはtry catch文で行う。
2種類以上の例外をキャッチすることが可能。 また、catch(Exception e(変数))とすれば、 Exception系の例外は全てキャッチできる
try-catch構文
try { 本来の処理 } catch (例外クラス 変数名) { 例外が発生した場合の処理 } finally { 例外があってもなくれも必ず実行する処理 }
例外の伝播
subクラスで例外が発生し例外がキャッチできなかった場合に 呼び出し元のクラスへと例外処理のキャッチが委ねられること
スロー宣言
メソッドを宣言する際にスロー宣言を行うことで 発生するチェック例外をキャッチせずに呼び出し元へと伝播させることが許可される スロー宣言があるとコンパイルエラーにならない。
public static void sub() throws IOException { FileWriter fw = new FileWriter("data.txt"); }
- sub()はIOExceptionに例外処理を委譲する。 IOExceptionクラスでは例外を伝播してくる 可能性があるメソッド呼び出しをtry-catch文で 囲む必要がある
例外を発生させる
例外を発生させたい場所で意図的に例外を発生させることができる 例外インスタンスを監視しているJVMに例外を投げつける(throw)するイメージ
throw 例外インスタンス; ※一般的には「throw new 例外クラス名("エラーメッセージ");」となる