我开始使用Java编写代码(之前从未这样做过),我对输入验证感到头疼。
我需要在用户输入0到1000之间的数字时,while循环不断执行。这很好。问题是我想检查他输入一个数字,如果他没有,那么while循环应该继续执行并等待下一个输入。到目前为止,我的代码只在输入非数字的东西时抛出InputMismatchException,我看不出原因。
这是我的代码:
Scanner score = new Scanner(System.in);
int i = 0;
while (i < 1000000) {
System.out.print("Insert the new score: ");
if (score.hasNextInt()) {
i = score.nextInt();
if (i > 0) {
if (i < 200000) {
// do something
} else if (i < 500000) {
// do something
} else if (i < 700000) {
// do something
} else if (i < 100001) {
// do something
}
} else if (i < 0) {
// do something else
}
} else {
System.out.print("The score should be a number.");
i = score.nextInt();
}
}
答案 0 :(得分:1)
else{
System.out.print("The score should be a number.");
i = score.nextInt(); //<---problem
}
您知道输入不是数字,因此您不应该尝试使用int
将其读作nextInt()
。所以要使用无效数据
next()
将从扫描仪数据返回为Sting,您稍后可以忽略它(您甚至不需要将其存储在String变量中)nextLine()
(但要注意这一点,以避免:Skipping nextLine() after using next(), nextInt() or other nextFoo() methods)答案 1 :(得分:0)
您收到此错误是因为您告诉Scanner
获取整数,即使用户未输入整数也是如此。您需要接受所有输入(通过String
)并自行进行验证。
我已修改您的代码以将输入作为字符串(Scanner#nextLine
),然后尝试更新分数。
Scanner score = new Scanner(System.in);
int i = 0;
while (i < 1000000) {
System.out.print("Insert the new score: ");
if (score.hasNext()) {
final String input = score.nextLine();
try {
i = Integer.parseInt(input);
} catch (final Exception e) {
System.out.print("The score should be a number.");
continue;
}
}
if (i>0) {
if (i<200000) {
//do something
}
else if (i<500000) {
//do something
}
else if (i<700000) {
//do something
}
else if (i<100001) {
//do something
}
} else if (i<0) {
//do something else
}
}
请注意,continue;
语句将无限期地询问用户输入整数,直到用户输入,就像您在问题中所要求的那样。
答案 2 :(得分:0)
在你的最后一个else子句中,你调用score.nextInt()
虽然你知道下一个数字不是int。这就是你得到例外的原因。只需用以下内容替换else:
else {
System.out.print("The score should be a number.");
score.nextLine(); //This is the line you need to change
}
score.nextLine();
将安全地使用下一行输入,并让你回到循环中。
答案 3 :(得分:-1)
您需要将输入语句包装在try / catch块中并捕获InputMisMatchException。由于在Scanner中使用期望整数的nextInt(),因此发生InputMisMatchException。
Scanner input = new Scanner(System.in);
int i = 0;
do {
try {
System.out.print("Enter integer ");
i = input.nextInt();
} catch (InputMismatchException e) {
//anything but integer gets caught here.
System.out.print("Please enter only integer.");
}
//necessary to take the cursor back to start of line, clear the buffer
input.nextLine();
} while (i < 1000000);
上面的代码示例演示了如何捕获InputMisMatchException。
我注意到您在代码中使用了input.hasNextInt()
,而您只需要在代码的else块中替换以下内容。
i = score.nextInt()
带
score.nextLine();
如其他答案所述,这句话将清除等待下一次输入的缓冲区。例外是由于score.nextInt(),替换应该修复它。
答案 4 :(得分:-1)
您可能希望使用try-catch块包装内容。
Scanner score = new Scanner(System.in);
int i = 0;
while (i < 1000000){
try{
System.out.print("Insert the new score: ");
if (score.hasNextInt()){
i = score.nextInt();
if (i>0){
if (i<200000){
do something
}
else if (i<500000){
do something
}
else if (i<700000){
do something
}
else if (i<100001){
do something
}
}else if (i<0){
do something else
}
}else{
System.out.print("The score should be a number.");
i = score.nextInt();
}
}catch(Exception e){}
}