Java Scanner接收不存在的输入

时间:2014-02-23 02:04:23

标签: java java.util.scanner

我有一个循环,在从控制台接收到正确的输入后会中断。我正在使用Scanner从System.in读取一个字符串,这似乎是给我带来麻烦的。这是我的代码:

boolean loop = true;

while(loop) {
    try {
        System.out.println("Enter an input (\"input a\" or \"input b\"): ");

        String input = scanner.nextLine();

        System.out.println("");

        if (input.equals("input a")) {  
            System.out.println("Answer to input a.");
        } else if (input.equals("input b")) {   
            System.out.println("Answer to input b.");
        } else {
            throw new IllegalArgumentException();
        }

        loop = false;
    } catch (InputMismatchException e) {
        System.out.println(e.getMessage());
        System.out.println("");
    } catch (IllegalArgumentException e) {
        System.out.println("Input not recognized.  Please enter a valid input.");
        System.out.println("");
    }
}

当调用它时,它会循环一次,甚至没有等待来自用户的输入,然后实际停止并执行第二次应该执行的操作。 IE,输出,没有用户提供任何输入,是:

Enter an input ("input a" or "input b"):

Input not recognized.  Please enter a valid input.

Enter an input ("input a" or "input b"):

如果我给它一个错误的输入(以便它循环并再次询问),它会在等待之前循环两次。我不明白为什么。

为什么会发生这种情况,我该怎么办才能避免呢?

编辑:hasNext检查后的测试场景:

情景A:

Enter an input ("input a" or "input b"): input a //my input

Input not recognized.  Please enter a valid input.

Enter an input ("input a" or "input b"): //no input given here

Answer to input a.

情景B:

Enter an input ("input a" or "input b"): ddd //my input

Input not recognized.  Please enter a valid input.

Enter an input ("input a" or "input b"): //no input given here

Input not recognized.  Please enter a valid input.

Enter an input ("input a" or "input b"): input b //my input

Answer to input b.

产生此代码的代码:

boolean loop = true;

while(loop) {
    if (scanner.hasNext()) {
        try {
            System.out.println("Enter an input (\"input a\" or \"input b\"): ");

            String input = scanner.nextLine();

            System.out.println("");

            if (input.equals("input a")) {  
                System.out.println("Answer to input a.");
            } else if (input.equals("input b")) {   
                System.out.println("Answer to input b.");
            } else {
                throw new IllegalArgumentException();
            }

            loop = false;
        } catch (InputMismatchException e) {
            System.out.println(e.getMessage());
            System.out.println("");
        } catch (IllegalArgumentException e) {
            System.out.println("Input not recognized.  Please enter a valid input.");
            System.out.println("");
        }
    }
}

2 个答案:

答案 0 :(得分:2)

我尝试了你在问题中记下的代码,作为一个问题,但我根本找不到任何问题。但是,我想我只知道答案。

如果您在此之前使用原始类型或只是next()进行了任何其他输入,则需要刷新换行符,不幸的是下一个方法会遗留下来。要执行此操作,只需在方法返回输入字符串的语句之前调用“ scanner.nextLine()”,并将其分配给输入

您希望确保将该方法作为单独调用;你知道,靠自己。最好是在输入之前将它放在顶部的while循环中,这样每次迭代都会清除换行符。然后该语句将删除换行符,因此输入缓冲区为空。一旦清除完毕,您最终可以在第一次循环迭代时输入字符串。

答案怎么样?尝试一下,让我知道它是否有效!

答案 1 :(得分:1)

您应首先检查用户是否输入了任何数据:

if(scanner.hasNext())
{
   // code logic
}