例外の検出と処理
例外を検出するためのキーワードが try です。
try はブロック内の処理で発生した例外をすべて検出し、
後に続く catch のブロックのうちの該当する処理を呼び出します。
例外の処理を記述するためのキーワードが catch です。
catch の後の《(》 《)》 内には検出された例外が渡されます。
例外はクラス名によって処理を選択するのに持ちいられるのと同時に、
そのオブジェクトは例外処理内でデータとして利用される引数でもあります。
例外のクラスとは Exception またはそのサブ・クラスです。
try と catch はブロック単位である点は if と else の関係と似ています。
場合分けのスタイルはむしろ switch と case の関係に似ています。
try に対して最低1つは catch が必要です。
キーワード finally のブロックは、
try ブロックの処理に伴って必ず呼び出されます。
該当する例外のクラスが見つからなかった
場合の処理を書けるのは、
switch case の default に似ています。ただし、
finally の内容は catch の処理が実行された場合でも必ず呼び出される点が
違います。
また、try のブロックの処理が return, break, continue によって
途中で終わった場合にも呼び出されます。
try {
}
catch( Exception1 e ){
}
catch( Exception2 e ){
}
catch( Exception3 e ){
}
finally{
}
catch で指定される Exception のクラスのチェックは、
上から下に記述された順番に行われます。
したがって、ある Exception のクラスのサブクラスは、必ず上の位置に記述
しなくてはいけません。(これはコンパイル時にチェックされます。)
互いに継承関係がない Exceptionのサブクラスどおしの順番は任意でかまいません。
例外の発生
例外が発生したことを知らせるためのキーワードが throw です。 throw は try の中から呼び出されるメソッドの側に記述されます。 throw を行うメソッドは、その宣言部分で どんな例外を渡すのかキーワード throws によって宣言します。
public method() throws SpecialExeption {
throw new SpecialException("Error message");
}
throw で渡されるのは例外クラスのオブジェクトです。(クラスではありません。) 上の例のように throw の前にコンストラクタを呼び出して 例外のオブジェクトを生成する必要があります。