そこで、ユーザー入力から int を取得するプログラムを作成しています。非常に単純な try/catch ブロックがあり、ユーザーが int を入力しない場合は、入力するまでブロックを繰り返す必要があります。コードの関連部分は次のとおりです。
import java.util.InputMismatchException;
import java.util.Scanner;
public class Except {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
boolean bError = true;
int n1 = 0, n2 = 0, nQuotient = 0;
do {
try {
System.out.println("Enter first num: ");
n1 = input.nextInt();
System.out.println("Enter second num: ");
n2 = input.nextInt();
nQuotient = n1/n2;
bError = false;
}
catch (Exception e) {
System.out.println("Error!");
}
} while (bError);
System.out.printf("%d/%d = %d",n1,n2, nQuotient);
}
}
2 番目の整数に 0 を入力すると、try/catch は期待どおりに動作し、再度入力するように要求します。しかし、いずれかの数値に 5.5 を入力するなどして InputMismatchException が発生すると、無限ループでエラー メッセージが表示されるだけです。なぜこのようなことが起こるのでしょうか。また、どうすればよいでしょうか。(ちなみに、catch の引数として InputMismatchException を明示的に入力してみましたが、問題は解決しませんでした。
ベストアンサー1
next();
エラーが発生したら、電話をする必要があります。また、使用することをお勧めします。hasNextInt()
catch (Exception e) {
System.out.println("Error!");
input.next();// Move to next other wise exception
}
整数値を読み取る前に、スキャナーに整数値があることを確認する必要があります。また、そのような例外処理は必要ありません。
Scanner scanner = new Scanner(System.in);
int n1 = 0, n2 = 0;
boolean bError = true;
while (bError) {
if (scanner.hasNextInt())
n1 = scanner.nextInt();
else {
scanner.next();
continue;
}
if (scanner.hasNextInt())
n2 = scanner.nextInt();
else {
scanner.next();
continue;
}
bError = false;
}
System.out.println(n1);
System.out.println(n2);
Javadocのスキャナー
スキャナーが InputMismatchException をスローすると、スキャナーは例外の原因となったトークンを渡さないため、他の方法でトークンを取得またはスキップすることができます。