第8章 例外処理
8.2 例外処理の仕組みまとめ
ここまで例外処理の基本的な使い方の学習を行いました。本節ではこれまで学習してきた例外処理の仕組みについて再確認していきます。
8.2.1 例外処理を行った場合と行っていない場合の比較(例外処理のメリット)
繰り返し説明になってしまいますが、例外(exception)とは、本来ならばプログラム中では起こってはいけないエラー(想定外のエラー)が起こってしまうことをいいます。
堅牢なプログラムを作成するためには、例外が起こった時でもプログラムが異常な動作をしないようにしっかりと例外処理(exception handling)を行う必要があります。
例外処理を行うことで、以下のようなメリットがあります。
- プログラムの異常終了を防ぐことが可能になる。
- 1箇所に例外に対する処理をまとめることが可能になる。
どのような例外が発生するか事前に分かっていれば、エラー処理の方法としてif文が直ぐに思いつくと思います。しかし、if文で処理を行う場合には、例外が起こりそうな箇所に何度も記述する必要があり、プログラムも煩雑となりとても大変です。
そこで例外処理の出番となります。例外処理を使うことで例外に対する処理を一元管理できるようになります。また、例外を処理した場合には、プログラムを中断せずに処理を先に進めたり、どこでどのような異常が発生したのか情報を通知してからプログラムを中断することも可能になります。
例外処理のネスト(tryブロックの中に別のtryブロック)これまで学習してきたのと同じように、「ifブロック内に別のifブロック」、「forブロックの中に別のforブロック」といったように例外処理の「tryブロック内に別のtryブロック」を記述することも可能です。
あまりネストし過ぎるとプログラムが煩雑になり、分かりにくくなりますので注意しましょう。
8.2.2 例外処理の基本(try-catch-finally)
例外処理を行う時の記述方法はtry-catch-finallyが基本的な構文です。例外処理で使われる用語と共に復習します。
- 「例外をスロー(throw)する」
プログラム実行中にエラーが発生することを「例外をスロー(throw)する」と言います。
正確にはエラーが発生する際に、例外オブジェクトというエラー情報を保有したオブジェクトを生成し、そのオブジェクトをJava実行プログラムに渡すことをいいます。
- 「例外をキャッチ(catch)する」
catchステートメントのパラメータと発生した例外オブジェクトが一致することを「例外をキャッチする」といいます。例外をキャッチするとcatchブロック内の処理を実行します。
図 8.2.1: try~catch~finally基本構文
try
tryステートメントは例外の発生が予測される処理ブロックを { } で囲みます。
実際に例外が監視されるのは try { } で囲まれた処理ブロックのみになります。
catch
tryステートメントの次にいくつかの catchステートメントを続けて記述します。
catchステートメントは複数記述することが可能で、引数に例外オブジェクトを指定します。
finally
catchブロックが終了した時点でこのfinallyブロックが実行されます。
tryブロックや、catchブロックに return ステートメントが記述されていても、この finallyブロックは必ず実行されます。
一般的に finallyブロックでは、ファイルのClose処理や、データベースからの切断処理等を記述します。
なお、finallyブロックは省略することも可能です。
では次の節でより詳しく例外とクラスの関係を説明します。