Java Scanner 接收到不存在的输入

Posted

技术标签:

【中文标题】Java Scanner 接收到不存在的输入【英文标题】:Java Scanner receives nonexistent input 【发布时间】:2014-02-23 02:04:22 【问题描述】:

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

【问题讨论】:

【参考方案1】:

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

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

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

这个答案怎么样?试试看,让我知道它是否有效!

【讨论】:

这似乎是它 - 我用 next 来获取单个字符作为命令。我只能说我非常喜欢 std::cin :X 我不记得“next()”是否删除了换行符...不幸的是,这是输入字符串的完全不同方式的 JAVA,而不是 C++。 :D【参考方案2】:

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

if(scanner.hasNext())

   // code logic

【讨论】:

这会停止第一个循环,但是当我第一次输入输入时它会循环两次,然后每次只循环一次。 你为什么有 System.out.println("") 可以尝试注释掉吗 我做了,仍然做同样的事情。额外的 println 用于将行间距加倍。 您能否发布您的测试场景...您为复制问题执行了哪些步骤 添加到原帖。

以上是关于Java Scanner 接收到不存在的输入的主要内容,如果未能解决你的问题,请参考以下文章

Java Scanner的hasNext()方法

表存在时无法复制到不存在的表中

PCL链接到不存在的库报错

PCL链接到不存在的库报错

PCL链接到不存在的库报错

PCL链接到不存在的库报错