Javaソースコードにおいて、例外通知を受け取る書き方

Javaソースコードで例外通知を受け取る書き方を、知りたいです。

Javaソースコードで例外を受け取る場合、catch文で例外通知を受け取ります。
そこで例外処理を行ないます。

適切なメソッド内にcatch文を記述して、適切に例外処理を行なってください。
そうしたら、プログラム実行中に例外が発生しても、アプリは正しく動作します。

Javaソースコードにおいて、メソッド内で例外を受け取る書き方

プログラム実行中に例外が発生した場合、その例外をメソッド内で受け取る書き方があります。

発生した例外を、メソッド内で対処したい(解決したい)場合の書き方です。

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

メソッド内で例外を受け取る書き方
メソッド内で例外を受け取る書き方

例外が発生したメソッド内のcatch文で、例外通知を受け取ります。
そこで例外処理に対処します。

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

例外の対処(解決処理)は、メソッド内のcatch文に書きます。

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

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

メソッド内で例外を受け取る書き方の例

実際のメソッドについて、例外処理の例を示します。

ここではまず、赤線を見てください。
プログラムの詳細を理解する必要は、ありません。

メソッド内で例外を受け取る書き方の例
メソッド内で例外を受け取る書き方の例

例外は、「ファイルが見つからない」という例外です。

次の文で、その例外を通知します。

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

※ちなみにJavaのクラスには、java.io.FileNotFoundExceptionという例外のクラスがあります。
指定されたパス名で示されるファイルが開けなかったことを通知する例外クラスです。

上記のソースコードでは、FileNotFoundExceptionを通知する方が良いです。
2004年当時にこの記事を書いていた時、考慮していませんでした。

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

次の文で、そのエラーメッセージを表示します。

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

同じメソッド内に、
「ファイルが見つからない」という例外と、
「エラーメッセージを表示する」という対処が、書かれています。

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

Javaソースコードにおいて、別のメソッドで例外を受け取る書き方

プログラム実行中に例外が発生した場合、その例外を他のメソッドで受け取る書き方があります。

発生した例外について、他のメソッド内で対処したい(解決したい)場合の書き方です。

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

別のメソッドで例外を受け取る書き方
別のメソッドで例外を受け取る書き方

例外が発生したメソッドとは別のメソッドにおいて、catch文で例外通知を受け取ります。
別のメソッドのcatch文で、例外処理に対処します。

クラスAのメソッドAから、クラスBのメソッドBを呼び出します。
※上記のイメージでは、methodA()のtry文のブロック内から、メソッド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を返す、という風に処理できます。

「それぞれの呼び出し先」で例外の対処法を決めたい場合は、このようにプログラムを書くと良いです。

Javaソースコードにおいて、例外処理を中止する書き方

例外が発生した場合、処理を中止する書き方があります。

その例外により、その後の処理の続行を諦める場合の書き方です。

実行中のプログラムでは解決できない問題(例外)が起きた時など、このような書き方をします。

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

例外処理を中止する書き方
例外処理を中止する書き方

任意のメソッドにおいて、catch文で例外通知を受け取ります。
そこで、例外処理を中止します。

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

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

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

例外処理を中止する書き方の例

実際のメソッドについて、例外処理の例を示します。

ここではまず、赤線を見てください。
プログラムの詳細を理解する必要は、ありません。

例外処理を中止する書き方の例
例外処理を中止する書き方の例

次の文で、SAXPerserクラスのオブジェクトを作成します。

factory.newSAXParser();

もしも、そのオブジェクトの作成に失敗した場合は、
例外が通知されて、処理がcatch文に来ます。

このSAXPerserクラスのオブジェクトの作成が失敗する原因は、プログラムの実行環境にあります。
ほとんどの場合で実行環境に原因がある、と言えます。

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

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

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

SAXPerserクラスのオブジェクト作成失敗という例外を、解決する方法

SAXPerserクラスのオブジェクト作成失敗という例外を解決する方法は、

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

例えば実行中のプログラムが、どこからかsaxParser.jarファイルを探し出して、適切なディレクトリ内にコピーすることになります。

ただし、このような処理をすることは困難だと思います。

もしかしたらプログラムのインストール時、
ハードディスク内にsaxParser.jarファイルをコピーする処理で、コピーに失敗しているかもしれないからです。

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

【まとめ記事】へのリンク

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

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