[英]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.