数値入力時のエラー処理


■ 誤った値の入力

上記で説明したいずれの方法で入力した場合も、値は文字列としてコンピュータに入力されます。したがって、入力された値が数値でなくても入力時には問題になりません。 しかし、その入力値を数値に変換しようとすると、例えば Integer.parseInt() や Double.parseDouble()を用いて文字を数値に変換しようすると、実行時にエラーが発生します。
次の実行例は、身長に誤った値(1qw)が入力されたために標準体重が計算できず、エラーを出した例です。
[egi@taro]$ java JcInput2
身長?1qw
Exception in thread "main" java.lang.NumberFormatException: For input string: "1qw"
        at java.lang.NumberFormatException.forInputString(NumberFormatException.java:48)
        at java.lang.Integer.parseInt(Integer.java:477)
        at java.lang.Integer.parseInt(Integer.java:518)
        at JcInput2.main(JcInput2.java:13)
[egi@taro]$ 

このように、数値であることを前提に実行されるメソッドで、数値でない値が引数として渡されると実行時にエラーが出力されプログラムが停止します。 これはプログラムの翻訳時(javac)には出ない誤りです。

人間が入力する場合は、必ず誤りをおかす可能性があります。そのたびにエラーを起こし中断するプログラムでは役に立ちません。そこで、プログラム実行中に誤りが起こる可能性がある箇所では、それを想定してプログラム作成しておく必要があります。

■ エラー表示して計算しない方法

次の実行例は、身長を入力して標準体重を出力するプログラムです。 このプログラムでは、以前のプログラムと異なって、正しいデータを入力すると標準体重を計算し出力しますが、誤りのデータを入力すると次のようにメッセージを出力し、標準体重の計算をしません。
[egi@taro prog]$ java JcInput3
身長?156
身長は156です。
標準体重は50.4です。
[egi@taro prog]$ java JcInput3
身長?1we
データが誤りで計算できません
[egi@taro prog]$ 

このプログラムは、次のように作成されています。

// 数値を入力し、計算結果を表示する。
import java.io.*;

public class JcInput3{
    public static void main(String[] arges) throws IOException {
	String  sincho;
	int dt;
                   
	BufferedReader kbd = new BufferedReader(new InputStreamReader(System.in));

                   System.out.print("身長?");
                   sincho = kbd.readLine();
          
	   try{
	         dt = Integer.parseInt(sincho);
	         System.out.println("身長は"+sincho+"です。");
                           System.out.println("標準体重は"+((dt-100)*0.9)+"です。");
	   }
	   catch(NumberFormatException e){
	       System.out.println("データが誤りで計算できません");
	   }
			   
    }
}

このプログラムで新しく使われている命令は、上記のブルーの色の部分です。 これは、try{ }の{ }内にエラーが発生する可能性のある命令を置き、もしここでエラーが発生したらどうするかを catch( ){ }の{ } に記述します。そのとき、エラーの種類を()内に指定します。
    try {
              エラーの発生する命令
         }
   catch(エラーの種類){
               エラーが発生した場合に実行する命令
             }
■ エラー表示して再入力させる方法

次のように入力した値がエラーであった時、エラーメッセージを表示した後に、 再入力させてくれるプログラムであれば、さらに親切です。
[egi@taro]$ java JcInput4
身長?1qa
データが誤りで計算できません
身長?1wd
データが誤りで計算できません
身長?157
身長は157です。
標準体重は51.300000000000004です。
[egi@taro]$
上記のような処理ができるプログラムは、以下のように繰り返し命令を使って書けます。 繰り返し命令の詳細は、次に学習しますが、ここでは入力処理が、
while(true){ 入力処理}

の形でwhile命令という繰り返し命令を使って無限に繰り返すように書かれています。 また、繰り返しを続けたり、中断したりする命令として、continue命令とbreak命令が新しく使われています。
// 数値を入力し、計算結果を表示する。
import java.io.*;

public class JcInput4{
    public static void main(String[] arges) throws IOException {
	String  sincho;
	int dt;
                   
	BufferedReader kbd = new BufferedReader(new InputStreamReader(System.in));

	while(true){
                       System.out.print("身長?");
                       sincho = kbd.readLine();
          
                       try{
                           dt = Integer.parseInt(sincho);
                           System.out.println("身長は"+sincho+"です。");
                           System.out.println("標準体重は"+((dt-100)*0.9)+"です。");
                          }
                       catch(NumberFormatException e){
                           System.out.println("データが誤りで計算できません");
                           continue;
                          } 
	   break;
	}
			   
    }
}


プログラミング / 江木