Java メソッドと例外クラスの関係をAPI仕様で調べる。

Javaの標準クラスライブラリには、様々なクラスが用意されています。
前回コマンドライン引数を整数型に変換するのに、IntegerクラスのparseInt()メソッドを使いました。
int prefCd = Integer.parseInt(args[0]);

とても便利な標準クラスライブラリですが、クラスに用意されたメソッドを使う場合には注意する点があります。それはメソッドは「例外が発生する可能性がある」ことです。例外とは予想していなかった事態のことです。

しかし心配することはありません。どんな例外が発生するのかは、JavaのAPI仕様に詳しく書かれています。メソッドの使い方を調べるついでに、そのメソッドではどんな例外が発生する可能性があるのかも確認する習慣をつけましょう。


【1】JavaのAPI仕様で、、IntegerクラスのparseInt()メソッドを調べてみましょう。
java.lang → Integer → parseInt(String s) とリンクをたどります。parseInt()メソッドは引数の型と数によっていくつか種類がありますので注意してください。

java-363.gif


【2】parseInt(String s)メソッドの説明が表示されました。
java-364.gif

parseInt()メソッドの説明からいろいろなことがわかります。
public static int parseInt(String s)throws NumberFormatException

・public 他のクラスから利用できる。
・static インスタンスを生成しなくてもメソッドが使える。*1
・int このメソッドはint型の値を返す。
・parseInt(String s) String型の値を1つ受け取る。
・NumberFormatExceptionという例外が発生する可能性がある。*2

*1 メソッドに static 修飾子を付けるとクラスメソッドとなり、クラス名.メソッド名 の形で利用できます。クラスメソッドは new演算子でインスタンスを生成しなくても使えます。

*2 NumberFormatExceptionは「文字列が構文解析可能な整数型を含まない場合」と書いてあります。引数が整数型に変換できない文字列の場合に、例外が発生するという意味です。


【3】次に NumberFormatException をクリックします。

java-365.gif


【4】例外クラスの継承関係が表示されました。

java-366.gif

java.lang.NumberFormatException は java.lang.Exception を継承していることがわかります。

ここで重要な点ですが継承関係にある例外クラスでは、上位のクラスで下位のクラスの例外を扱うことができます。つまり NumberFormatException に対応する例外は、Exception でもキャッチできるということです。

Javaでは例外が発生すると、例外クラスのオブジェクトが生成されます。try文に例外が起こりそうな処理を記述し、例外が送出されると型が一致するcatch文で受け取ります。

1つの try文 に対して catch文 は複数書くことができます。しかし下位の例外クラスから順に書く必要があります。上位の例外クラスを先に書くと、全部キャッチしてしまうからです。

・○良い例
try {
省略
} catch (NumberFormatException e) {
System.out.println("値を整数型に変換できませんでした。");
System.out.println("例外発生:" + e );
} catch (Exception e) {
System.out.println("例外発生:" + e );
}

・×悪い例
try {
省略
} catch (Exception e) {
System.out.println("例外発生:" + e );
} catch (NumberFormatException e) {
System.out.println("値を整数型に変換できませんでした。");
System.out.println("例外発生:" + e );
}


・以下のように Exception だけでも例外をキャッチできます。
try {
省略
} catch (Exception e) {
System.out.println("例外発生:" + e );
}


【5】例外の種類

・整数型の値が入るところに、文字が入力された場合
java-362.gif

・既にあるPREF_CD を追加しようとした場合java.sql.SQLExceptionという例外が発生しています。
java-367.gif

・java.sql.SQLExceptionの継承関係

java-368.gif

SQLException は Exception を継承しているので、 SQLException を書いていなくても Exception でキャッチできたわけです。

・java.lang.Exception直系の既知のサブクラス
java-369.gif

Exception は多くの例外クラスのスーパークラスですので、ほとんどキャッチしてしまいます。

ではなぜ複数のcatch文が必要なのでしょうか。それは例外の種類によって、その後の処理を細かく制御したいことがあるからです。

以上のようにJavaには例外処理があるおかげで、エラーに強いプログラムを書くことができます。


スポンサードリンク

スポンサードリンク






Java初心者入門講座TOPへ