|
では、実際の具体的な処理として、throwされるExceptionに対処するためのtry/catch節を説明します。下記のように
を記述します。このとき例外が発生する可能性のあるコードはtryとcatchの間に記述し、対処する(捕らえる)例外の種類をcatch節で宣言します。そしてcatch節の内部で捕らえた例外に対する対処コードを記述します。実際には以下のように記述します。下記のコードはインスタンスが存在しないクラス型の変数に対してメソッドを実行しているので、substringメソッドを実行した時にNullPointerExceptionという例外がthrowされてきます。
|
例:例外発生時の対処
|
| |
|
|
| |
try{
String str = null;
str = str.substring(1);//この部分でNullPointerExceptionが発生
System.out.println( str );
} catch( NullPointerException e ){//補足対象のExceptionを宣言
// 対象となる例外が発生しなければ実行されない
e.printStackTrace();//Exceptionクラスのメソッドで例外の詳細を出力するメソッドを実行
System.out.println( "ヌルポンが発生したようです。" );
}
|
|
| |
|
|
|
この時、重要なのが飽くまでも補足対象の例外はNullPointerExceptionのみだと言うことです。仮にtry節の内部でIOExceptionがthrowされたとしても上記のcatch節では補足されません。しかし、もしcatch節を以下のように宣言したとしたら全ての例外を補足することができます。
} catch( Exception e ) {
これは、なぜでしょうか?実は全ての種類のExceptionはjava.lang.Exceptionクラスを継承しているのです。継承については今後詳しく説明しますが、IOExceptionもNullPointerExceptionもExceptionを継承しているということです。つまりExceptionクラスの機能を拡張してNullPointerExceptionクラスは作られているためExceptionクラスの機能は全て持っているのです。もちろんIOExceptionに関しても同様です。ところが下図を見て下さい。NullPointerExceptionとIOExceptionは互いに継承関係にはないためNullPointerExceptionをIOExceptionとして扱うことや、その逆はできません。
|
図:Exceptionの継承図
|
|
|
| IOException,RuntimeException,NullPointerExceptionはExceptionとして扱うことができます。またNullPointerExceptionはRuntimeExceptionとして扱うことができます。 |
またcatch節は一つだけでなく下記のように複数記述することもできます。この時注意しなければならないのが、上のcatch節から実行されていくと言うことです。つまり判定の順番がIOException→NullPointerException→Exceptionと言うことです。
|
例:例外発生時の対処2
|
| |
|
|
| |
try{
・・・・・
} catch( IOException e ){//最初に補足
e.printStackTrace();
System.out.println( "IOで問題が発生したようです。" );
} catch( NullPointerException e ){//2番目に補足
e.printStackTrace();
System.out.println( "ヌルポンが発生したようです。" );
} catch( Exception e ){//3番目に補足
e.printStackTrace();
System.out.println( "何らかの問題が発生したようです。" );
}
|
|
| |
|
|
|
これらのtry/catch節により予想される例外に対して対処ができるだけでなく、予想外の例外が発生した時にも迅速に特定することができます。また、try文にはcatchだけでなくfinally節というものもあります。finally節とは、例外が発生しようがしまいがtry文を抜ける時には必ず実行されます。後に学ぶデータベースとのコネクションなどは何が起きようと必ずクローズ処理をしなければならないのでfinally節でクローズ処理を記述します。
|
例:例外発生時の対処3 finally節
|
| |
|
|
| |
try{
・・・・・
} catch( Exception e ){//3番目に補足
e.printStackTrace();
System.out.println( "何らかの問題が発生したようです。" );
} finally {//例外が発生してもしなくても必ず実行される
//必ず行わなければならない処理を記述
con.close(); //例えばコネクションのクローズとか
}
|
|
| |
|
|
|
|