为什么我的错误我的异常处理会导致无限循环?
Why does my error my exceptions handling cause an infinite loop?
我在处理异常时遇到问题。如果我输入一个数字,程序运行正常,但如果输入一个字符,程序会创建一个无限循环。
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
假设您输入 "abc"
您对 input.nextInt()
的调用导致扫描器查看 a
并说 "That's not an int, so I will throw an exception."
在异常处理程序中,您将 ask
设置为 true
,以便循环重复。
当循环重复时,扫描仪再次查看完全相同的 a
,它会显示 "That's not an int, so I will throw an exception."
在异常处理程序中,您将 ask
设置为 true
,以便循环重复。
等等....
那个讨厌的 a
永远不会被扫描仪消耗掉。
来自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"
试试下面的代码:
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
我在处理异常时遇到问题。如果我输入一个数字,程序运行正常,但如果输入一个字符,程序会创建一个无限循环。
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
假设您输入 "abc"
您对 input.nextInt()
的调用导致扫描器查看 a
并说 "That's not an int, so I will throw an exception."
在异常处理程序中,您将 ask
设置为 true
,以便循环重复。
当循环重复时,扫描仪再次查看完全相同的 a
,它会显示 "That's not an int, so I will throw an exception."
在异常处理程序中,您将 ask
设置为 true
,以便循环重复。
等等....
那个讨厌的 a
永远不会被扫描仪消耗掉。
来自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"
试试下面的代码:
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