我在处理异常时遇到麻烦。如果我输入数字,程序运行正常,但是如果输入字符,则会创建无限循环。
boolean ask= true;
while(ask)
{
ask = false;
try
{
System.out.println("What is the age?");
int age = input.nextInt();
setAge(age);
}catch(InputMismatchException e) {
System.out.println("Invalid input!");
ask = true;
}
}//end while
答案 0 :(得分:1)
假设您输入“ abc”
您对input.nextInt()
的调用使扫描程序查看a
并说:“那不是整数,所以我会抛出异常。”
在异常处理程序中,将ask
设置为true
,以便重复循环。
重复循环时,扫描程序会再次查看完全相同的a
,并说“这不是整数,所以我会抛出异常。”
在异常处理程序中,将ask
设置为true
,以便重复循环。
以此类推。...
令人讨厌的a
永远不会被扫描仪消耗掉。
答案 1 :(得分:1)
尝试以下代码:
boolean ask= false;
while(!ask)
{
try
{
System.out.println("What is the age?");
int age = input.nextInt();//does not read the newline character in your input created by hitting "Enter,"
setAge(age);
ask = true;
}catch(InputMismatchException e) {
System.out.println("Invalid input!");
input.nextLine();//consumes the \n character
}
}//end while
答案 2 :(得分:0)
来自nextInt的源代码:
public int nextInt(int radix) {
// Check cached result
if ((typeCache != null) && (typeCache instanceof Integer)
&& this.radix == radix) {
int val = ((Integer)typeCache).intValue();
useTypeCache();
return val;
}
setRadix(radix);
clearCaches();
// Search for next int
try {
String s = next(integerPattern());
if (matcher.group(SIMPLE_GROUP_INDEX) == null)
s = processIntegerToken(s);
return Integer.parseInt(s, radix);
} catch (NumberFormatException nfe) {
position = matcher.start(); // don't skip bad token
throw new InputMismatchException(nfe.getMessage());
}
}
它使用Integer.parseInt(s, radix);
来产生结果。
如果呼叫Integer.parseInt("s");
将导致:
线程“ main”中的异常java.lang.NumberFormatException:对于输入字符串:“ s”