mat*_*aso 34 java infinite-loop java.util.scanner
所以,我对这段代码感到困惑:
import java.util.InputMismatchException;
import java.util.Scanner;
public class ConsoleReader {
Scanner reader;
public ConsoleReader() {
reader = new Scanner(System.in);
//reader.useDelimiter(System.getProperty("line.separator"));
}
public int readInt(String msg) {
int num = 0;
boolean loop = true;
while (loop) {
try {
System.out.println(msg);
num = reader.nextInt();
loop = false;
} catch (InputMismatchException e) {
System.out.println("Invalid value!");
}
}
return num;
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的输出:
插入整数:
无效的值!
插入整数:
无效的值!
...
sam*_*aur 58
根据扫描仪的javadoc:
当扫描程序抛出InputMismatchException时,扫描程序将不会传递导致异常的标记,因此可以通过其他方法检索或跳过它.
这意味着如果下一个令牌不是a int
,它会抛出InputMismatchException
,但令牌会保留在那里.因此,在循环的下一次迭代中,reader.nextInt()
再次读取相同的标记并再次抛出异常.你需要的是用它.reader.next()
在你的内部添加一个catch
使用令牌,这是无效的,需要丢弃.
...
} catch (InputMismatchException e) {
System.out.println("Invalid value!");
reader.next(); // this consumes the invalid token
}
Run Code Online (Sandbox Code Playgroud)