例外処理
- try/catch
Javaではプログラムのエラーを「エラー(error)」と「例外(exception)」の二種類に分けます。エラーはプログラムによって対応できないエラーとかですね。例えば、OutOfMemoryなどですね。このJavaのエラーはErrorクラスおよび、Errorクラスの子クラスのオブジェクトとして表現されます。
これに対して「例外」はプログラムの中にそれに対する対応処理を書く事ができるエラーです。この例外は2種類あって、実行時例外(runtime exception)とチェックされる例外(checked exception)があります。
どう違うかと言うと処理を実行したときに想定外の事象で例外が発生する事で、起こる時には実行時にやむえず起きてしまう例外の事を言います。
対してチェックされる例外とは、それらに対するチェックと対応を事前にソースコードの中に義務付けられている例外です。例えばファイル読み込み処理で、読み込もうとするファイルがない!というような場合の事です。
// ファイルが見つからない場合のエラー処理の実装方法 try{ //チェックされる例外が発生しうる処理 ファイルのI/Oの文 }catch(IOException e){ eに対する処理; またはそのほかの処理; }
上記処理でエラー処理はOKと思ったら大間違いです。僕もこれから記述するfinally節を書かなかったために例外処理が漏れていてアプリケーションで障害を起こした事があります。
例えば、例外が発生しそれに対応する処理を実行します。そしてさらに例外が発生してもしなくても実行したい処理があった場合です。典型的な例は書き込み用にopenしたファイルをcloseする事なく処理を行ってしまう例などです。きちんとcloseしないと、書き込み処理が正常に行われないですし。
try{ ・・・ } catch(・・・){ ・・・ } finally{ ・・・//例外が起きても起きなくても必ず実行させたい文 }
- throws
Javaでなにかのメソッドを書いていて、この中の処理でtry/catchを書かなければいけないけどこのメソッドの呼び出し側でやらせたいなー、なんて時にthrowsをシグネチャに書く事で回避できます。以下の例ではsampleMethodを呼び出している文方でtry/catchで囲む義務が生じてきます。
void sampleMethod(key) throws IOException{ 処理文1 処理文2 // 本当ならここでtry{}catch(IOException e){}で囲むべき文 処理文3 }
逆にメソッドの中で例外やエラーを起こしたい!なんて時は以下のように記述します。
throw new MyException(コンストラクタに与える引数);
MyExceptionという例外クラスをどこかで定義しておいて、そのオブジェクトをここで作っていて、投げられるわけです。デバックや障害発生時に調査するために書いたりするのかな。