プログラミング応用b 第6回『例外』 |
【実際の使用例】
●例外を使ってみよう
では,復習として,実際に例外を使用しているプログラム例を見てみよう(下図List 5)。List 5-①では,4つの例外クラス
E1〜E4を,Exceptionのサブクラスとして定義している。
クラスAの中では,処理1〜処理4を行うメソッドm1( )〜m4( )と,後処理を行うメソッドpost( )が定義されている(List 5-②〜⑥)。
m1( )は,フィールドiの値が1だったらE1型例外を投げる。同様に。m2( )は,iが2だったらE2型例外を投げる,という具合にm4( )まで
定義されている。
クラスExceptionExample1のメソッドh( )は,仮引数でA型メンバオブジェクトaのフィールドiを初期化している。そして,List 5-⑦
が処理の中心で,tryブロックの中で,処理1〜処理4までを実行するために,メソッドm1( )〜m4( )が順序よく呼ばれてる。
その後ろに,E1〜E4型の例外をキャッチするそれぞれのcatchブロックがあり(List 5-⑧〜⑪),最後に,finallyブロックで後処理
を行うpost( )メソッドが呼ばれている(List 5-⑫)。
main( )メソッドでは,メソッドh( )に実引数0〜4を渡して呼び出している(List 5-⑬〜<17>)。List 5-⑬の呼び出し
h( 0 );
では,例外は投げられないので,表示結果は
process #1
process #2
process #3
process #4
postprocess
----------
となり,処理1〜処理4と後処理が実行されることがわかる。List 5-⑭の呼び出し
h( 1 );
では,メソッドm1( )を呼んだときにE1型例外が投げられ,List 5-⑧のcatchブロックでキャッチされるので,表示結果は
process #1
E1
postprocess
----------
となる。実際にList 5を実行してみて,List 5-⑮以降の表示結果がどうなるかも確認してみよ。
List 5 ExceptionExample1.java
【まとめ】
ここで,例外の利点をまとめてみよう。
・通常の処理の記述がシンプルで読みやすくなる
※上図List 5-⑦の部分は,正規の処理が整然と並んでいて,どのように処理が進んでいくか一目瞭然である。
これは,古典的な手法を使ったList 2-①の読みにくさに比べると雲泥の差である。また,エラー処理部分も,
List 2-②では,どの部分がどのエラーを処理しているのかひと目では分からないが,List 5-⑧〜⑪で
は,どのcatchブロックが,どの例外を処理しているかは明確にわかる。
・例外を使うと,メソッドの返り値を自由に使用することができ,例外オブジェクトが生成されて投げられるのは,
エラーが起こったときだけ
※これらの点は,メソッドの返り値をエラー通知に使用する方法に比べて,格段に優れている。
・オブジェクトという高度な情報体をエラー通知に使えるので,様々なエラー処理の方法を考えることができる
※たとえば,Javaの例外クラスが,Fig.2のように継承関係を使って系統的に組織化されているように,自分で
エラーの種類を系統的に分類することも可能である。
このように,古典的なエラー処理に比べて,例外処理は様々な利点を持っている。しかし,古典的なエラー処理(
例えば,エラーコードを返値として返すメソッドなど)にも,例外処理の仕組みに比べて単純であるという強みがある。
したがって,例外処理を主なエラー処理として使いつつ,必要に応じて古典的な方法も利用すると良いだろう。
◆JavaのAPIドキュメントでは,例外を投げる可能性があるメソッドについては,投げられる例外についても明示され
ている。JavaAPIのメソッドを利用するときには,例外についてもよく確認して,それらのメソッドから投げられる
可能性のある例外を,確実にキャッチできるようにプログラムを書くこと。