如果我注释掉garbage = scan.nextLine();
行,则while循环无限运行。否则,它没有。我理解为什么如果只有print命令它会无限运行,但我不完全理解包含garbage
变量如何阻止它无法运行。有人可以解释一下吗?
import java.util.Scanner;
public class TypeSafeReadInteger
{
public static void main(String [] args)
{
Scanner scan = new Scanner(System.in);
String garbage;
System.out.print("Enter age as an integer > ");
while (! scan.hasNextInt())
{
garbage = scan.nextLine();
System.out.print("\nPlease enter an integer > ");
}
int age = scan.nextInt();
System.out.println("Your age is " + age);
}
}
答案 0 :(得分:4)
garbage
只是一个变量,它会停止' while循环是nextLine()
这是一个等待用户输入的方法。在您的用户使用键盘输入内容并将输入保存到garbage
变量之前,while不会继续。
答案 1 :(得分:2)
你需要知道两件事:
hasNextLine()
不推进扫描程序实例。nextLine()
推进扫描程序实例。通过"推进扫描仪实例",我的意思是"消费"输入。将输入视为流,并将扫描器对象视为消耗该流的内容。
普通流中的内容只能使用一次。您在名为garbage
的变量中捕获了您的内容,但您可以轻松调用scan.nextLine()
而不存储结果。我强烈建议您阅读Javadoc on Scanner以查看哪些方法推进了扫描仪实例,哪些方法没有。
答案 2 :(得分:0)
修复您的代码:
while (!scan.hasNextInt())
{
scan.nextLine(); // the order of the lines inside the loop makes the difference!
System.out.print("\nPlease enter an integer > ");
// when you perform nextLine() here - you reach the beginning of the loop
// without a token in the scanner - so you end up looping forever
}
int age = scan.nextInt();
顺便说一下 - 正如您从上面的示例中看到的那样,garbage
是多余的。
答案 3 :(得分:0)
如果用户输入一个整数,那么一切正常。如果他们不这样做,那么由于Scanner类的工作方式,你会得到没有garbage = scan.nextLine();
行的无限循环。
当您执行scan.hasNextInt();
之类的操作时,实际上不会从输入中读取任何字符。因此,如果用户输入类似“cat”的内容以响应您的提示,则输入将在该单词的第一个字母之前暂停。由于您在循环中直到输入中存在整数,因此不会进一步读取并且您将无限循环,因为“cat”只是位于输入缓冲区中。
通过添加scan.nextLine()
,您将导致扫描程序放弃用户点击< enter>时的所有内容。并且可以处理其他输入。