我打印不同的选项,用户输入一个数字以选择正确的选项。它第一次工作,但是当选择一个选项时,它会根据所选选项打印不同的选项。当用户尝试从第二个打印列表中选择一个选项时,程序会陷入无限循环。
protected int getIntegerInput(Scanner scan) {
while (! scan.hasNextInt())
;
return scan.nextInt();
}
protected <T> int getChoice(String description, List<T> list) {
printPosibilities(description, list);
while (true) {
try (Scanner scan = new Scanner(System.in)) {
int choice = getIntegerInput(scan) - 1;
scan.close();
if (isValidChoice(choice, list)) {
if (choice == list.size()) {
System.out.println("Canceled.");
return CANCEL;
}
return choice;
} else
throw new IllegalArgumentException();
} catch (InputMismatchException | IllegalArgumentException e) {
printInvalidChoice();
}
}
}
它在getIntegerInput()中陷入了困境。在打印可能的选项时调用getChoice()。
修改 我修好了它。您需要删除该尝试,因为它会自动关闭扫描仪。而while循环中的scan.next()。
答案 0 :(得分:5)
您需要使用Scanner
while (!scan.hasNextInt()) {
scan.next(); // consume non-integer values
}
答案 1 :(得分:0)
上面有简短的解释,但这里有关于扫描仪的更多信息:
想想Scanner
就像这样。
假设您有String
,“Hello world,这是一个字符串!”
想想它会被每个空格分开''。
每次在扫描仪上调用.next()
时,它会将缓冲区移动到下一个空格。
所以...对于这个例子:
Scanner.next()
// grabs Hello
// "Hello world, this is a String!"
// ^ Buffer
Scanner.next()
// grabs world,
// "Hello world, this is a String!"
// ^ Buffer`
在您的情况下,由于您使用的是while()
循环,因此需要在循环内的某处调用.next()
(或.nextInt()
)。
避免将.next()
调用放入条件语句和返回语句中。我不确定具体细节,但它经常会在没有错误的情况下破坏你。