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 接收到不存在的输入的主要内容,如果未能解决你的问题,请参考以下文章