我正在尝试编写一种向用户询问正整数的方法。如果未输入正整数,则将输出一条消息,提示“请输入正值”。这部分不是问题。问题是,当我尝试实现捕获InputMismatchExceptions的try catch语句(以防用户意外输入字符或字符串)时,循环将无限运行并吐出与InputMistmatchException相关的错误消息。
这是我的代码:
private static int nonNegativeInt(){
boolean properValue = false;
int variable = 0;
do {
try {
while (true) {
variable = scanner.nextInt();
if (variable < 0) {
System.out.println("Please enter a positive value");
} else if (variable >= 0) {
break;
}
}
properValue = true;
} catch (InputMismatchException e){
System.out.println("That is not a valid value.");
}
} while (properValue == false);
return variable;
}
答案 0 :(得分:2)
基本上,正在发生的是,当给定令牌无效时,扫描程序会遇到错误,因此它无法超过该值。当下一次迭代再次开始备份时,scanner.nextInt()再次尝试扫描下一个输入值,该值仍然是无效的,因为它永远不会过去。
您想要做的就是添加行
scanner.next();
在您的catch子句中基本上说跳过该令牌。
侧面说明:您的方法通常太长。您可以将其缩短为此。
private static int nonNegativeInt() {
int value = 0;
while (true) {
try {
if ((value = scanner.nextInt()) >= 0)
return value;
System.out.println("Please enter a positive number");
} catch (InputMismatchException e) {
System.out.println("That is not a valid value");
scanner.next();
}
}
}
答案 1 :(得分:0)
您正在捕获异常,但没有更改变量适当值的值,因此catch语句将永远运行。在catch语句中添加properValue = true;
甚至break
语句将为您提供所需的功能!
希望我能帮上忙!
答案 2 :(得分:0)
只需在您的捕获中添加一个break
语句即可。
顺便说一句,您可以像这样重写它来摆脱while
循环:
try {
variable = scanner.nextInt();
if (variable < 0) {
System.out.println("Please enter a positive value");
} else {
properValue = true;
}
}
//...
答案 3 :(得分:0)
您可以在do-while循环开始时声明扫描程序,因此nextInt()不会一遍又一遍地引发异常。
private static int nonNegativeInt(){
boolean properValue = false;
int variable = 0;
do {
scanner = new Scanner(System.in);
try {
while (true) {
variable = scanner.nextInt();
if (variable < 0) {
System.out.println("Please enter a positive value");
} else if (variable >= 0) {
break;
}
}
properValue = true;
} catch (InputMismatchException e){
System.out.println("That is not a valid value.");
}
} while (properValue == false);
return variable;
}
答案 4 :(得分:0)
这确实与SO: Java Scanner exception handling
几乎相同两个问题:
您的异常处理程序中需要一个scanner.next();
... AND ...
您实际上并不需要两个循环。一个循环就可以了:
private static int nonNegativeInt(){
boolean properValue = false;
int variable = 0;
do {
try {
variable = scanner.nextInt();
if (variable < 0) {
System.out.println("Please enter a positive value");
continue;
} else if (variable >= 0) {
properValue = true;
}
} catch (InputMismatchException e){
System.out.println("That is not a valid value.");
scanner.next();
}
} while (properValue == false);
return variable;
}