例外処理を考える(2)

前回はJavaの例外処理の仕組みについて簡単にまとめました。今回からは実際の例外の扱いについて具体的に考えていきたいと思います。

次の2つの場合を順に考えることにしましょう。

  1. 例外に対処する
  2. 例外を発生させる

例外に対処するときの考え方

何に失敗したのか?

J2SEの標準APIを使っていても、スローされる例外に対処しなければならない機会はそれなりにあるものです。よくあるのはファイル入出力関連・ネットワーク関連・DB関連でしょう。いずれもJVMの外の世界とやりとりするため、予測不可能な事態が発生する可能性は高いと言えます。例外をスローするメソッドが多いのもうなずけます。

「いや、NullPointerExceptionとかIndexOutOfBoundsExceptionをよく見るよ」という方、それはプログラミングエラーです。ご自身のコードをよく見直したほうがいいと思います・・・。

ともあれ、具体的に見てみましょう。ローカルファイルからテキストを読み込んで出力する単純なプログラムを考えてみます。(対処方法はこれから考えていくので、とりあえず例外をキャッチしたらスタックトレースを出力するようにしました) 続きを読む 例外処理を考える(2)

例外処理を考える(1)

プログラマにとって例外処理は避けて通れない厄介な問題です。今回はJavaでの例外処理について考えてみたいと思います。

はじめに、Javaの例外処理のための仕組みを整理しましょう。

try〜catch〜finally節

例外を発生させるコード(メソッド・コンストラクタ・もしくは自分で発生させる)を使う部分をtry節で括り、その例外への対処をcatch節に、例外の有無に関わらず行う処理をfinally節に書きます。

try {

    // 例外を発生させるコード

} catch (SomeException1 e) {

    // SomeException1が発生した場合の処理

} catch (SomeException2 e) {

    // SomeException2が発生した場合の処理

} finally {

    // 例外の有無に関わらず行う処理

}

異なる例外を処理するcatch節は複数並べて書くことができますが、発生した例外に対応するcatch節かどうかは上から順に判定されることになっているため、ある例外を処理するcatch節の次にそのサブクラスに当たる例外を処理するcatch節を書くことはできません。(到達不能コードとなります)

この複数書ける、というところが重要です。つまり対処する例外とその対処方法を選択できるということですね。 続きを読む 例外処理を考える(1)