为什么我不能在 java 中调用 nextLine() 方法两次?

Why cannot I call nextLine() method twice in java?

在使用 Java 的 nextInt() 方法时,我遇到了这段代码:

Scanner scan = new Scanner(System.in);
int count = scan.nextInt();
String string1 = scan.nextLine();

我知道 string1 将包含一个空字符串。我的问题是为什么像下面这样调用 nextLine 方法两次会出现错误:

String string1 = scan.nextLine().nextLine();

这里:

String string1 = scan.nextLine().nextLine();

让我们分解一下:

String string1 = scan.nextLine()

在扫描仪上调用 nextLine()。它 returns 一个 String.

因此,您的代码归结为

String string1 = someOtherString.nextLine(); 

这当然行不通。因为字符串 class 不知道下一行,因此没有这样的方法!

记住:扫描仪returns一个字符串,这是两个截然不同的对象。

如果你从盒子里拿出一个鸡蛋,你为什么期望你能从你得到的那个鸡蛋中取出另一个鸡蛋?!一个盒子可以取出两个鸡蛋,一个鸡蛋不能取出一个鸡蛋。

最后:是的,有 "fluent" API 的想法,它允许以 "such" 方式链接方法调用。但是 can 仅适用于明确为此设计的场景。

如何调试?

我认为比简单的答案更重要的是关于如何调试它的一些信息。

假设您使用的是像 IntelliJ 或 Eclipse 这样的 IDE,它们为此提供了丰富的功能(谷歌搜索很容易)。

以 IntelliJ 为例:

  • ctrl + q 方法名称将显示其 return 类型和相关信息。
  • 如果您只是将第一个方法调用写在一行上,您可以执行 alt + enter 并告诉它创建局部变量。这将针对正确的类型(应该是 String,这很明显。
  • 你也可以做ctrl + b跳转到函数调用,看清楚return是一个String
  • 另外,调试器会让它变得很明显。

Java 文档

此外,您总是可以很容易地跳转到 google 中扫描仪的 Java 文档。

https://docs.oracle.com/javase/7/docs/api/java/util/Scanner.html#hasNextLine()

实际上,Java 文档通常在您的 IDE 中可用或可下载,当您使用 ctrl + b 跳转到函数时,即使使用浏览器也可以节省您的时间:)。

基本答案

但无论如何,您的问题只是第一个函数调用 return 是一个字符串,它不是扫描仪,因此您不能在其上使用扫描仪功能 :)。

查看 Scanner#nextLine() 的 return 类型。它 return 是 String,而不是 Scanner

你写的相当于:

String string1 = scan.nextLine();
String string2 = string1.nextLine();

方法链用于从一个对象跳转到下一个对象,由每个方法的 return 类型定义,使您的代码更紧凑并减少您所做的声明量。

参考:Why is nextLine() returning an empty string?

scannerObj.nextInt() 不读取以下换行符,因此第一个 nextLine(returns 当前行的其余部分)will always return an empty string.

这应该有效:

int count = readInput.nextInt();
readInput.nextLine();

String input=readInput.nextLine();