Java -例外処理-
例外処理には2つの方法があります。
- try~catch文によって、発生した例外を処理する。
- throwsキーワードによって、発生した例外オブジェクトを呼び出し元のメソッドに送る。
このような例外処理を行わないと、例外発生時にプログラムの実行が中断されてしまいます。
try~catch文
try~catch文は、例外が発生した場合にその例がオブジェクトに対応する処理を実行し、例外が無効化された状態に戻すための構文です。
try{ //例外が発生する可能性のある処理; }catch(例外クラス名 1変数名1){ //例外クラス1が発生したときの処理; }catch(例外クラス名2 変数名2){ //例外クラス2が発生したときの処理); }finally{ //例外の有無にかかわらず最後に実行する処理; }
- tryブロックには、例外が発生する可能性のある処理を記述します。
- catchブロックは、複数記述できますが、実行されるのは該当する最初の1つだけで、 その後は、finallyブロックが実行されます。
- finallyブロックに記述した処理は、例外の発生の有無にかかわらず必ず最後に実行されます。
finallyブロックは、省略することもできます。また、catchブロックと違ってfinallyブロックを 複数記述することはできません。
tryブロック内で発生した例外オブジェクトは、該当するcatchブロックがある場合に例外処理がされます。
その際に、例外オブジェクトは無効化されます。したがって、該当するcatchブロックがある場合は、 catchブロックの終了以降、その例外によって実行が中断することはありません。
該当するcatchブロックがない場合は、try~catch文が終了しても例外オブジェクトは無効化されずプログラムが 終了してしまいます。
複数のcatchブロックの指定
try~catchブロックを複数してして、複数の例外に対応することができます。
ある例外オブジェクトをキャッチするには、その例外と同じクラスかまたはその例外のスーパークラスをcatchの引数に指定します。
継承関係のある複数の例外クラスを複数のcatchブロックで指定する場合は、必ず、サブクラスを先に指定しなければなりません。
スーパークラスを先にcatchブロックで指定すると、その後で記述したサブクラスのcatchブロックには いなかる場合でも到達できず、「到達不能エラー」となってしまいます。
throwsキーワードによる例外処理
あるメソッドで発生した例外を、そのメソッドの呼び出し元で例外処理をしたい場合は、例外オブジェクトを 呼び出し元へ送るために、メソッドの後ろにthrowsキーワードを記述します。
throwsメソッドの後ろには、そのメソッドで発生する可能性のあるすべてのチェック例外の 例外クラスを記述しなければなりません。(非チェック例外は、任意)
[修飾子] 戻り値 メソッド名() throws 例外クラス名1[,例外クラス名2]・・・{・・・}
※ [ ]は省略可能
- throwsキーワードによって例外処理を記述しても、それで例外処理がすべて完了してわけでは ありません。例外によって実行が中断しないようになっただけで、例外オブジェクトそのものを無効化したわけではないからです。
- throwsキーワードによって例外オブジェクトを呼び出し元に送出しても、呼び出し元のメソッドにtry~catch文の 記述がなかったり、あるいは更にそのメソッドの呼び出し元のメソッドに例外オブジェクトを送出するthrowsキーワード の記述がない非チェック例外の場合、呼び出し元のメソッドで実行が中断します。チェック例外の場合なら コンパイルエラーになります。
- throwsキーワードに指定する必要があるのは、チェック例外に属するクラスだけです。
非チェック例外に属するクラスは、throwsの後ろに指定しなくても構いません。非チェック例外 オブジェクトは、throwsでの指定にかかわらず、必ず呼び出し元に送出されます。
チェック例外をthrowsキーワードで指定する際、その例外クラスのスーパークラスを指定する このもできます。
throwキーワードによる例外オブジェクトの発生処理
throwsキーワードとよく似たキーワードにthrowキーワードがあります。
このキーワードは、コード内の任意の箇所で故意に例外オブジェクトを生成して投げる場合 に利用します。
例外処理の組み合わせ
- throwsキーワードを利用した例外処理では、そのメソッドの呼び出し元にも例外処理を記述する必要が あります。
- 呼び出し元でtry~catch文を記述すれば、投げられて送られた例外オブジェクトを catchブロックで例外処理し、例外オブジェクトを無効化することができます。
- さらに呼び出し元のメソッドでもthrowsキーワードを使用した場合は、そのメソッドを呼び出した元の メソッドに例外オブジェクトが送られます。