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

ale*_*per 14 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());
Run Code Online (Sandbox Code Playgroud)

期待的是:

Love is good  <- press ENTER
Love is blind <- press ENTER
Love is good  <- output
Love is blind <- output
false
Run Code Online (Sandbox Code Playgroud)

什么:

Love is good   <- I press ENTER
Love is blind  <- I press ENTER
Love is good   <- output
Love is blind  <- output
<- press ENTER
true <- output
Run Code Online (Sandbox Code Playgroud)

不明白的是:

  1. 而不是立即打印此行 - System.out.println(sc.hasNextLine()); - 它让我再次按ENTER
  2. 它打印为true而不是false,而没有更多的行或符号

读过的内容:我已经读过十几个关于在nextInt()之后使用hasNextLine()的stackoverflow答案以及nextInt()如何不使用行中的最终符号但是我不明白为什么,即使我不知道在这里使用nextInt(),我仍然需要再按一次ENTER,以及为什么hasNextLine()为true.

Sна*_*ƒаӽ 14

而不是像这样Scanner使用BufferedReader:

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());
    }
}
Run Code Online (Sandbox Code Playgroud)

有关此事的更多信息,请查看此处此处.根据经验,当你需要解析东西(比如nextInt)使用时Scanner,否则坚持使用BufferedReader.BufferedReader比它快得多Scanner.

至于为什么说你有麻烦的行为,请参阅的javadocScanner.

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

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

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


Arc*_*676 11

扫描仪文档(我强调):

public boolean hasNextLine()
Run Code Online (Sandbox Code Playgroud)

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

可能发生的hasNextLine是阻塞,因为它正在等待输入,你可以通过按Enter键来输入.


小智 10

首先,你使用Scanner声明为System.in,这意味着你要求.in检查它们是否还有更多值,等待用户输入内容,然后在按Enter键后显然它返回true.

所以如果你想检查s或p声明Scanner像这样:

Scanner sc = new Scanner(s);
Run Code Online (Sandbox Code Playgroud)

要么

Scanner sc = new Scanner(p);
Run Code Online (Sandbox Code Playgroud)

然后检查sc.hasNextLine();这应该返回false,因为我知道但是对于用户输入,我建议创建另一个Scanner变量,然后从用户获取值并使用sc作为你的hasNextline()东西.

我希望第一个逻辑可以帮助你.


Ano*_*sse 9

要求三行输入!

在您关闭终端之前,标准输入总是还有一条线路.在Unix系统上,您可以在结尾按Ctrl + D,它将返回(=输入已关闭).flase

如果您输入有限,程序将按预期运行.但交互式输入:程序如何知道用户不打算接下来输入莎士比亚

该功能hasNextLine()等待新输入到达(或者对于不能有新输入的信号).此功能不适用于"用户是否输入另一行",而是表示" 等待下一行".因此,出于实用的目的,hasNextLine()相当于"仍然是连接用户输入,并且可以其最终包含另一条线".

你为什么需要最后一行?只需删除它!


J. *_*Su. 6

您遇到的问题是,扫描程序正在从给定的InputStream读取数据,这可能类似于文件或System.in.

如本回答所述,文件有一个结尾,并且sc.hasNextLine()将返回false.通过使用流,您希望它无法提供输入数据,因此将阻塞并等待您的下一个输入.

也许你可以想到一些"退出的char"(这里是'#'):

Scanner sc = new Scanner(System.in);
StringBuilder builder = new StringBuilder();
while (sc.hasNextLine()) {
    String line = sc.nextLine();
    if (line.equals("#")) {
        break;
    }
    builder.append(line + "\n");
}
System.out.println(builder.toString());
sc.close();
Run Code Online (Sandbox Code Playgroud)