为什么 Java 要求我再次按 Enter 键?

2022-09-03 16:37:22

我绞尽脑汁已经有一段时间了,试图了解扫描仪是如何工作的。所以这是代码:

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());- 它使我再次按回车键
  2. 它打印真而不是假,而没有更多的线条或符号

读过什么:我已经阅读十几个关于在下一个Int()之后使用hathNextLine()的堆栈溢出答案,以及关于nextInt()如何不消耗行中的最后一个符号,但我不明白为什么,即使我在这里不使用nextInt(),我仍然需要再按一次Enter,以及为什么hathNextLine()是真的。


答案 1

而不是像这样使用:ScannerBufferedReader

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());
    }
}

有关此事的更多阅读,请查看此处此处。根据经验,当你需要解析东西(比如)使用时,否则坚持使用。BufferedReader也快得多。nextIntScannerBufferedReaderScanner

至于为什么你会得到这种麻烦的行为,请参阅javadoc for 。Scanner

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

扫描操作可能会阻止等待输入。

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


答案 2

来自扫描仪文档(由我强调):

public boolean hasNextLine()

如果此扫描仪的输入中有另一行,则返回 true。此方法可能会在等待输入时阻塞。扫描仪不会前进超过任何输入。

可能发生的事情是阻塞,因为它正在等待输入,您可以通过按Enter键给出输入。hasNextLine


推荐