我有一个循环,在从控制台接收到正确的输入后会中断。我正在使用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("");
}
}
}
答案 0 :(得分:2)
我尝试了你在问题中记下的代码,作为一个问题,但我根本找不到任何问题。但是,我想我只知道答案。
如果您在此之前使用原始类型或只是next()进行了任何其他输入,则需要刷新换行符,不幸的是下一个方法会遗留下来。要执行此操作,只需在方法返回输入字符串的语句之前调用“ scanner.nextLine()”,并将其分配给输入。
您希望确保将该方法作为单独调用;你知道,靠自己。最好是在输入之前将它放在顶部的while循环中,这样每次迭代都会清除换行符。然后该语句将删除换行符,因此输入缓冲区为空。一旦清除完毕,您最终可以在第一次循环迭代时输入字符串。
答案怎么样?尝试一下,让我知道它是否有效!
答案 1 :(得分:1)
您应首先检查用户是否输入了任何数据:
if(scanner.hasNext())
{
// code logic
}