2019年01月25日
JAVA scannerクラスのnextInt()を利用した際、無限ループに陥ってしまう
scannerクラスのnextInt()を利用し、キーボードから数値を入力させる。
このとき、数値以外の文字が入力されると、プログラムの書き方によっては無限ループに陥ってしまう。
【Ex.】 数値を3つ入力させる。数値以外の文字が入力された場合は再度入力を促す。
public static void main(String[] args) {
int input[] = new int[3];
Scanner scan = new Scanner(System.in);
System.out.println("数字を入力してください");
for(int n = 0;n < 3;n++){
System.out.print((n + 1) + "個目 :");
try{
input[n] = scan.nextInt();
}
catch(InputMismatchException e){
System.out.println("数字を入力してください");
System.out.println("もう一度入力してください");
n--;
}
}
}
上記プログラムは、一見問題なく動くように見えるが、文字が入力されると無限ループに陥ってしまう。
これは、スキャナが InputMismatchException をスローすると、例外の原因となったトークンを読み飛ばさないため。
つまり、文字が入力され例外が発生した場合、
通常は(readLine()などでは)エラーになった文字は捨ててしまうが(読み飛ばしてしまうが)、
nextInt()はそれを読み飛ばさないため、永遠にエラー文字を読み取り続け無限ループに陥ってしまう。
この場合、オブジェクトを初期化し「前回のエラー文字を持っていない」新しいオブジェクトで呼び出すようにすることで解消される。
public static void main(String[] args) {
int input[] = new int[3];
System.out.println("数字を入力してください");
for(int n = 0;n < 3;n++){
System.out.print((n + 1) + "個目 :");
try{
Scanner scan = new Scanner(System.in);
input[n] = scan.nextInt();
}
catch(InputMismatchException e){
System.out.println("数字を入力してください");
System.out.println("もう一度入力してください");
n--;
}
}
}
このとき、数値以外の文字が入力されると、プログラムの書き方によっては無限ループに陥ってしまう。
【Ex.】 数値を3つ入力させる。数値以外の文字が入力された場合は再度入力を促す。
public static void main(String[] args) {
int input[] = new int[3];
Scanner scan = new Scanner(System.in);
System.out.println("数字を入力してください");
for(int n = 0;n < 3;n++){
System.out.print((n + 1) + "個目 :");
try{
input[n] = scan.nextInt();
}
catch(InputMismatchException e){
System.out.println("数字を入力してください");
System.out.println("もう一度入力してください");
n--;
}
}
}
上記プログラムは、一見問題なく動くように見えるが、文字が入力されると無限ループに陥ってしまう。
これは、スキャナが InputMismatchException をスローすると、例外の原因となったトークンを読み飛ばさないため。
つまり、文字が入力され例外が発生した場合、
通常は(readLine()などでは)エラーになった文字は捨ててしまうが(読み飛ばしてしまうが)、
nextInt()はそれを読み飛ばさないため、永遠にエラー文字を読み取り続け無限ループに陥ってしまう。
この場合、オブジェクトを初期化し「前回のエラー文字を持っていない」新しいオブジェクトで呼び出すようにすることで解消される。
public static void main(String[] args) {
int input[] = new int[3];
System.out.println("数字を入力してください");
for(int n = 0;n < 3;n++){
System.out.print((n + 1) + "個目 :");
try{
Scanner scan = new Scanner(System.in);
input[n] = scan.nextInt();
}
catch(InputMismatchException e){
System.out.println("数字を入力してください");
System.out.println("もう一度入力してください");
n--;
}
}
}
この記事へのコメント
コメントを書く
この記事へのトラックバックURL
https://fanblogs.jp/tb/8501976
※ブログオーナーが承認したトラックバックのみ表示されます。
この記事へのトラックバック