我正在尝试创建一个检查整数的函数,并将继续循环,直到用户正确输入17或更高的整数。但是,如果我输入错误的输入,比如'K'或'&',它将陷入无限循环。
public static int getAge(Scanner scanner) {
int age;
boolean repeat = true;
while (repeat) {
try
{
System.out.println("Enter the soldier's age: ");
age = scanner.nextInt();
repeat = false;
}
catch(InputMismatchException exception)
{
System.out.println("ERROR: You must enter an age of 17 or higher");
repeat = true;
}
}
return age;
}
如果下一个可用的输入标记不是整数,则nextInt()
将该输入保留为未消耗,在Scanner
内缓冲。这个想法是你可能想尝试用其他Scanner
方法读取它,例如nextDouble()
。不幸的是,这也意味着除非你做了一些事情来摆脱缓冲的垃圾,你下一次调用nextInt()
将会尝试(并且失败)再次读取相同的垃圾。
所以,为了清除垃圾,你需要在尝试再次调用next()
之前调用nextLine()
或nextInt()
。这可以确保下次调用nextInt()
时,它将使用新数据而不是相同的旧垃圾:
try {
//...
}
catch(InputMismatchException exception)
{
System.out.println("ERROR: You must enter an age of 17 or higher");
scanner.next(); // or scanner.nextLine()
repeat = true;
}
我不会将扫描程序传递给您的方法我会尝试重新构造它,并将方法分配给主体中的变量,如下所示:
我也在我的catch中使用递归来调用异常被捕获时的方法,id也建议使用可能的一般异常,使其捕获(异常异常)
main method call of method
---------------------------
int something= getAge();
----------------------------------------------------------
method structure like this,
---------------------------------------------
public static int getAge() {
int age;
age = scanner.nextInt();
boolean repeat = true;
while (repeat) {
try
{
System.out.println("Enter the soldier's age: ");
if(age<=17){
repeat = false;
}
if(age>17){
getAge();
}
}
catch(InputMismatchException exception)
{
System.out.println("ERROR: You must enter an age of 17 or higher");
getAge();
}
}
return age;
}
<!-- end snippet -->