java - 为什么 Java 要求我再次按下 Enter?

标签 java java.util.scanner

我绞尽脑汁想了解 Scanner 的工作原理已经有一段时间了。所以这是代码:

Scanner sc = new Scanner(System.in);
String s = sc.nextLine();
String p = sc.nextLine();
System.out.println(s);
System.out.println(p);
System.out.println(sc.hasNextLine());

我的期望:

Love is good  <- press ENTER
Love is blind <- press ENTER
Love is good  <- output
Love is blind <- output
false

拥有:

Love is good   <- I press ENTER
Love is blind  <- I press ENTER
Love is good   <- output
Love is blind  <- output
<- press ENTER
true <- output

不明白的地方:

  1. 而不是立即打印这一行 - System.out.println(sc.hasNextLine()); - 它让我再次按下 ENTER 键
  2. 当没有更多的线条或符号时,它打印 true 而不是 false

读过的内容:我已经阅读了很多关于在 nextInt() 之后使用 hasNextLine() 以及 nextInt() 如何不消耗 final 的 stackoverflow 答案符号,但我不明白为什么,即使我在这里不使用 nextInt(),我仍然需要再按一次 ENTER 以及为什么 hasNextLine() 为真。

最佳答案

像这样使用 BufferedReader 而不是 Scanner:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

class Test {
    public static void main(String[] args) throws IOException {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));

        String s = reader.readLine();
        String p = reader.readLine();
        System.out.println(s);
        System.out.println(p);      
        System.out.println(reader.ready());
    }
}

有关此事的更多信息,请查看 herehere .根据经验,当您需要解析内容(如 nextInt)时,请使用 Scanner,否则请使用 BufferedReader。 BufferedReader 也比 Scanner 快很多。

至于为什么会出现这种麻烦的行为,请参阅 javadoc对于扫描仪

适用于您的特定情况的部分是:

A scanning operation may block waiting for input.

在您的情况下,这意味着:在 Scanner 读取前两行之后,Scanner 正在等待输入,这是由其方法调用 引起的sc.hasNextLine()。然后当 Enter 被击中时,它得到一个输入(因此它打印 true,根据 docs 当有输入时它返回 true) .在方法调用 sc.hasNextLine() 之后,您的程序中不再有可执行行,程序结束,给人一种它需要 两次 输入命中的错觉。 p>

关于java - 为什么 Java 要求我再次按下 Enter?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34836931/

相关文章:

java - Context.getContentResolver().query() 给出空指针异常

java - 如果用户输入不满足条件,则返回消息

java - java STDIN nextLine() 中的扫描器

java - 删除字符串数组中具有相同字符的字符串

java - spring.kafka.consumer.auto-offset-reset 在 spring-kafka 中如何工作

java - 如何在 java 中使用扫描器类捕获空白输入

Java Scanner 不等待用户输入

java - 如何让扫描器循环直到它读取到所需的字符串?

java - 无法在 eclipse 3.7 和 4.2 中创建包

java - 将对象引用设置为 null 或调用 finalize() 方法?