为什么我不能在 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();
在使用 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();