例外処理・Javaソースコードの書き方

メソッド内に例外を通知

例外が発生した場合、その例外をメソッド内に通知する書き方があります。
発生した例外を、メソッド内で対処したい(解決したい)場合の書き方です。

「例外処理の流れ」は、次のようなイメージです。
赤線が「例外処理の流れ」を示します。
catch文で、例外の対処をします。

例外処理の流れ

「この例外処理の流れ」は、水平に右方向に行き、そして下方向に行きます。
水平に右方向に行く点が、「正常処理の流れ」と違います

例外の対処(解決処理)は、メソッド内のcatch文に書きます。
同じメソッド内に「発生した例外」と「その対処」が書かれているので、「例外処理の流れ」を理解しやすいと思います。

try文とcatch文の距離が近いほど、「例外処理の流れ」を理解しやすいです。

例外処理の例

実際のメソッドについて、例外処理の例を示します。
ここではまず、赤線を見てください。
プログラムの詳細を理解する必要は、ありません。

例外処理の例

例外は、「ファイルが見つからない」という例外です。
次の文で、その例外を通知します。

throw new Exception("not found file name = " + fileName);

例外の対処は、「ファイルを読み込むことができません」というエラーメッセージを、画面に表示することです。
次の文で、そのエラーメッセージを表示します。

window.showErrorMessage(fileName + jp.Resource.get("canNotReadFile"));

同じメソッド内に、

  • 「ファイルが見つからない」という例外と、
  • 「エラーメッセージを表示する」という対処が

書かれています。
よって「例外処理の流れ」を理解しやすい、と思います。

例外を他のメソッドに通知

例外が発生した場合、その例外を他のメソッドに通知する書き方があります。
発生した例外について、他のメソッド内で対処したい(解決したい)場合の書き方です。

「例外処理の流れ」は、次のようなイメージです。
赤線が、「例外処理の流れ」を示します。
catch文で、例外の対処をします。

他のメソッドに通知する例外

クラスAのメソッドAから、クラスBのメソッドBを呼び出します。
そのメソッドBにおいて、例外が発生します。
例外の対処(解決処理)は、クラスAのメソッド内にあるcatch文に書きます。

このように例外を通知する場合、メソッドBを呼び出したメソッドAにおいて、メソッドBで発生した例外について対処できます。

もしもメソッドBが、ある2個のメソッドから呼び出された場合、メソッドBの例外について、それら2個のメソッド内で、それぞれで例外の対処を行なえます。

例外処理の例

実際のメソッドについて、例外処理の例を示します。
ここではまず、赤線を見てください。
プログラムの詳細を理解する必要は、ありません。

「他のメソッドに通知する例外」の例

次の文で、ExTextFieldクラスのgetValue()メソッドを、呼び出します。

minValueField.getValue();

次の文において、変数textの値が数値に変換できない文字列形式の場合、例外が起きます。

例:変数textが文字列"abc"の場合、例外NumberFormatExceptionが起きます。

Integer.parseInt(text);

その例外は、getValue()メソッドの呼び出し先であるNumericalRangeFieldPanelクラス、getMinValue()メソッドに通知されます。

そのgetMinValue()メソッド内のcatch文において、例外の対処(解決処理)をします。
次の文で例外の対処として、最小の値として1を返す、としています。

例:変数textが文字列"abc"の場合、最小の値として1を返して、プログラム処理を続けます。

return 1;

このgetValue()メソッドのように、例外を他のメソッドに通知する場合、例外の対処は、getValue()メソッドの「それぞれの呼び出し先」で、決めることができます。

例えば別のメソッドにおいて、例外の対処として最小の値100を返す、という風に決められます。
「それぞれの呼び出し先」で例外の対処法を決めたい場合は、このようにプログラムを書くと良いです。

例外処理の中止

例外が発生した場合、処理を中止する書き方があります。その例外により、その後の処理の続行を諦める(ギブアップする)場合の書き方です。
実行中のプログラムでは解決できない問題(例外)が起きた時など、このような書き方をします。

「例外処理の流れ」は、次のようなイメージです。
赤線が、「例外処理の流れ」を示します。
catch文で、例外の対処をします。

例外処理の中止

この「例外処理の流れ」は、水平に右方向に行き、そして下方向に行きます。
そしてcatch文に来ます。

しかし、ここでは例外に対処することを諦めて、再び例外を通知します。
例:RuntimeExceptionを通知します。

このRuntimeExceptionは、受け止める(catchする)必要がない例外です。
このような受け止める必要がない例外を通知することによって、例外に対処することを諦めます。

例外処理の例

実際のメソッドについて、例外処理の例を示します。
ここではまず、赤線を見てください。
プログラムの詳細を理解する必要は、ありません。

「例外処理の中止」の例

次の文で、SAX Perserのオブジェクトを作成します。

factory.newSAXParser();

もしも、そのオブジェクトの作成に失敗した場合は、例外が通知されて、処理がcatch文に来ます。
このSAX Perserオブジェクトの作成が失敗する原因は、プログラムの実行環境にあります(ほとんどの場合で実行環境に原因がある、と言えます)。

実行環境に原因があるため、実行中のプログラムは「その例外(問題)」を解決できません。

よって次の文で例外を通知して、処理の続行を諦めます。

throw new RuntimeException("could not create SAX Parser", cause);

参考:この例外を解決する方法

この例外を解決する方法は、例えばsaxParser.jarファイル(仮名)を、適切なディレクトリ内にコピーする、という方法です。

実行中のプログラムが、どこからかsaxParser.jarファイルを探し出して、適切なディレクトリ内にコピーする、という処理をすることは困難だと思います。
もしかしたらプログラムのインストール時、ハードディスク内にsaxParser.jarファイルをコピーし忘れているかもしれないからです。

※この記事は、2004年6月当時の記事になります。

【まとめ記事】アプリの品質を保つため、Javaソースコードを書くための工夫

Javaソースコードを正しく書くための、ちょっとした工夫について、ご紹介しています。 変数の寿命を決める書き方。 肯定的な条件を優先して条件分岐する書き方。 クラス名…