我正在尝试编写一个方法,询问用户是否为正整数。如果未输入正整数,则输出消息“请输入正值”。这部分不是问题。问题在于,当我尝试实现捕获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;
}
基本上发生的事情是,当给定令牌无效时,扫描程序会遇到错误,因此无法超过该值。当下一次迭代再次重新开始时,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();
}
}
}
您正在捕获异常,但您没有更改变量适当值的值,因此catch语句将永远运行。在catch语句中添加properValue = true;
甚至break
语句可以为您提供所需的功能!
我希望我帮忙!
您可以在do-while-loop的开头声明扫描程序,因此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;
}
这确实几乎与SO: Java Scanner exception handling相同
两个问题:
scanner.next();
......和......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;
}
只需在捕获物中添加一个break
语句即可。
顺便说一句,你可以通过重写它来摆脱while
循环:
try {
variable = scanner.nextInt();
if (variable < 0) {
System.out.println("Please enter a positive value");
} else {
properValue = true;
}
}
//...