我需要解释扫描仪hasNextInt()
的工作原理。在下一个例子中:
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
boolean foo = sc.hasNextBoolean();
System.out.println(sc.nextLine());
}
当程序到达hasNextBoolean()
时,它等待我的输入。然后按Enter键进行换行并键入true并再次按Enter键,因此缓冲区如下所示:[\ n true \ n]。
现在指针是单词true,所以foo变为true。但是,指针应该仍然挂在true上,当下一行出现时,程序应该打印为true,但会发生的是它只是打印换行符。为什么会这样,请问?
另一方面,使用nextInt()做同样的事情,就像我期望的那样:
public static void main(String[] args) {
Scanner skener = new Scanner(System.in);
try{
int stagod = skener.nextInt();}
catch(Exception e){
System.out.println(skener.nextLine());}
}
当程序到达skener.nextInt()
时,按Enter键然后输入A然后按Enter键,缓冲区如下所示:[\ n A \ n]。
现在,在捕获异常后,指针停留在A上,System.out.println(skener.nextLine());
打印A。
答案 0 :(得分:0)
sc.hasNextBoolean()工作正常。问题是你没有考虑到sc.hasNextBoolean()没有超过它读取的输入。
sc.hasNextBoolean()读取输入但不超过它。因此在调用之后,输入缓冲区将是" \ n",一行。 sc.nextLine()读取后扫描器超过输入。但在这种情况下,它还等待用户输入另一行。对你而言,那将是" true \ n"这将使缓冲区" \ ntrue \ n"正如所料。但缓冲区长2行。 sc.nextLine()只读取一行(下一行)。下一行是" \ n",它只是一个换行符。在System.out.println()调用之后。缓冲区中仍有数据,现在是" true \ n"。还剩下一行。
您会发现,如果再添加一个System.out.println(sc.nextLine()),您的代码将按预期工作。
sc.nextInt()工作的原因是因为它会使扫描程序超过它读取的输入。它等待一行输入然后读取它。此时,缓冲区为" \ n"。但是它也会超过它刚刚读取的输入,所以缓冲区现在是空的。下次调用sc.nextLine()时,扫描仪位于您键入的行之前的位置,而不是后面的行。所以你只需要一次调用sc.nextLine()。
问题的关键不在于扫描仪方法不能按预期工作。你的问题很简单,就是你没有考虑到关于Scanner.hasNextBoolean()方法的一个次要但又至关重要的细节。文档中有一些小东西,比如可以创建或破坏程序的东西。下次,请记住在实现之前阅读您正在使用的方法的完整文档。