目次> 第5章> 5.2 TOPUPPREVNEXT

5.2 コマンドのパラメータと判断・分岐

例外が発生しないように、プログラムを工夫してみましょう。

まず、コマンド・ラインにデータがあるかどうかをしらべ、 ない場合にはゼロとみなすことにしましょう。

コマンド・ラインの第1パラメータを、整数に変換している個所
int arg1 = Integer.parseInt(args[0]);
を、以下の2行に変更します。
int arg1 = 0;
if(args.length>0) arg1 = Integer.parseInt(args[0]);
まず、 arg1 を ゼロ にしておいて、 パラメータの個数がゼロより大きい (1以上)のときにパラメータを整数に変換して、 arg1 を設定しなおすように変更しました。

第2パラメータについても同様です。

int arg2 = Integer.parseInt(args[1]);
を、以下の2行に変更します。
int arg2 = 0;
if(args.length>1) arg2 = Integer.parseInt(args[1]);
まず、 arg2 を ゼロ にしておいて、 パラメータの個数が1より大きい (2以上)のときにパラメータを整数に変換して、 arg2 を設定しなおすように変更しました。

if から始まる文を if文 と呼びます。

if というつづりの後に、 値が true か false になる式 をカッコでくくって書き、文を1つ続けます。 具体的には、文が1つきてセミコロンで終わる場合と、 中カッコにくくられたブロックがくる場合があります。

if 文は、カッコの中を計算し、結果が true ときだけ、 if文に書かれた文を実行します。 ここでは、

「より大きい」が判りにくかったら、「以上」を使って次のように書いても全く同じ動作をします。

if(args.length >= 1) arg1 = Integer.parseInt( args[0] );
if(args.length >= 2) arg2 = Integer.parseInt( args[1] );

if 文 は、もう1つ別の書き方があります。商を計算する再に、arg2 の値がゼロであれば、

pane.add(new JLabel("商:−"));
を実行し、そうでなければ
pane.add(new JLabel("商:"+ (arg1/arg2)));
を実行するという場合、次のように書きます。
        if(arg2 == 0) pane.add(new JLabel("商:−"));
        else          pane.add(new JLabel("商:"+ (arg1/arg2)));

カッコでくくられたの値が true のときは、カッコのすぐ後に書かれた文を実行し、 false のときは else の後の文を実行します。

以上の点を変更して、Compute2.java を作成しました。

Compute2-1.gif

うまくいっていますね。では、こんなのはどうでしょう? (下図の赤の下線)

Compute2-2.gif

例外が発生しました。「Compute2.java の 16行目で呼ばれている、 java.lang.Integer.parseInt で、4.5 という文字列に対して、 NumberFormatException という例外が発生した」と表示されています。

読み方は:
  1. 表示されたメッセージのカッコの中を上から下に順に、 自分の作ったプログラムの名前をさがす
  2. ここでは、一番下の黄色い下線部分 Compute2.java が見付かる
  3. 16行目に発生原因があることが判る
  4. そのすぐ上の行をみる。
  5. 16行目で問題をおこしたのは、 java.lang.Integer.parseInt の参照であると判る
簡単にいうと、parseInt4.5 はダメ といわれてしまいました。

この例外に対して、どのように対処するのがよいのでしょうか?

4.5 というデータは、 この章の【テーマ】に述べた3つの前提から外れています。 このように、あらかじめ設定した問題の範囲をこえたデータに対して、 「 例外が発生しないようにする 」 という対処方法はあまり賢くありません。 いくら対処を綿密にしても「キリがない」からです。 前のセクションで掲げた、(1)なにもしない、 あるいは (2)例外が発生したことを検知して対処する といった方法が有効です。
ここでは、 「 (1)なにもしない 」 ことにしましょう。 これもりっぱな対処方法です。(^^)


更新日:2006-04-06 TOPUPPREVNEXT