繁体   English   中英

Java扫描器收到不存在的输入

[英]Java Scanner receives nonexistent input

我有一个循环,当从控制台收到正确的输入时,该循环会中断。 我正在使用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("");
        }
    }
}

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

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

您要确保单独调用方法; 你知道的,独自一人。 最好在输入之前将其放在顶部的while循环中,以便每次迭代都清除换行符。 然后,该语句将删除换行符,因此输入缓冲区为空。 一旦清除,就可以在第一次循环迭代中最终输入字符串。

那是怎么回事? 试试看,让我知道它是否有效!

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM