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

时间:2018-09-10 15:10:46

标签: java method-chaining

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

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

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

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

4 个答案:

答案 0 :(得分:8)

这里:

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

让它分解:

String string1 = scan.nextLine()

在扫描仪上呼叫nextLine()。它返回一个 String

因此,您的代码归结为

String string1 = someOtherString.nextLine(); 

这当然是行不通的。因为String类不知道下一行,所以也没有这样的方法!

请记住:扫描程序返回一个字符串,这是两个非常不同的对象。

如果您从包装盒中取出一个鸡蛋,为什么会期望可以从得到的鸡蛋中取出另一个鸡蛋?您可以从同一盒子中取出两个鸡蛋,但不能从鸡蛋中取出一个鸡蛋。

最后:是的,有一个“流利的” API的想法,它允许以“这种”方式链接方法调用。但这只能用于明确为此目的而设计的方案。

答案 1 :(得分:1)

如何调试它?

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

假设您使用的是IntelliJ或Eclipse之类的IDE,它们具有丰富的功能(对它们进行查询很容易)。

以IntelliJ为例:

    方法名称上的
  • ctrl + q将为您显示其返回类型和有关其的信息。
  • 如果仅在一行上编写第一个方法调用,则可以执行alt + enter并告诉它创建局部变量。这将为正确的类型(本来应该是String,这样做很明显。
  • 您还可以执行ctrl + b跳入函数调用,并查看它清楚地返回了String
  • 此外,调试器将使其变得显而易见。

Java文档

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

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

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

基本答案

但是无论如何,这里的问题只是第一个函数调用返回一个String,它不是扫描器,因此您不能在其上使用扫描器功能:)。

答案 2 :(得分:1)

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

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

这应该有效:

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

String input=readInput.nextLine();

答案 3 :(得分:0)

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

您写的等同于:

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

方法链用于根据每个方法的返回类型从一个对象跳转到下一个对象,从而使您的代码更加紧凑,并减少了声明的数量。