使用Scanner.hasNextInt的无限循环

时间:2014-05-15 14:00:21

标签: java java.util.scanner

我打印不同的选项,用户输入一个数字以选择正确的选项。它第一次工作,但是当选择一个选项时,它会根据所选选项打印不同的选项。当用户尝试从第二个打印列表中选择一个选项时,程序会陷入无限循环。

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()。

2 个答案:

答案 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()调用放入条件语句和返回语句中。我不确定具体细节,但它经常会在没有错误的情况下破坏你。