プログラミング応用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のメソッドを利用するときには,例外についてもよく確認して,それらのメソッドから投げられる
 可能性のある例外を,確実にキャッチできるようにプログラムを書くこと。