【问题标题】:Why cannot I call nextLine() method twice in java?为什么我不能在 java 中调用 nextLine() 方法两次?
【发布时间】:2018-09-10 15:10:45
【问题描述】:

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

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

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

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

【问题讨论】:

  • 因为nextLine 返回一个String 而它没有nextLine 成员函数。
  • Scanner#nextLine 返回一个 字符串,而不是另一个 Scanner 对象。链接在这里没有什么意义。您想使用返回的字符串值。
  • (添加到现有的 cmets) 一般来说,您可能会看到这种现象称为“终端操作符”或“终端操作” - 这意味着方法返回的对象并不多或任何用于继续流或链的有用选项。在使用 Streams 时,这绝对是一个更常见的术语,但这个概念是全球性的。
  • 感谢回归!

标签: java method-chaining


【解决方案1】:

这里:

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

让我们分开:

String string1 = scan.nextLine()

在扫描仪上调用nextLine()。它返回一个字符串

因此,您的代码归结为

String string1 = someOtherString.nextLine(); 

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

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

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

最后:是的,有“流利的”API 的想法,它允许以“这样的”方式链接方法调用。但是,可以只适用于明确设计的场景。

【讨论】:

    【解决方案2】:

    如何调试这个?

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

    假设您使用 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 中可用或可下载,即使使用浏览器也可以节省您的时间:)。

    基本答案

    但无论如何,你的问题只是第一个函数调用返回一个字符串,它不是扫描器,所以你不能在它上面使用扫描器函数:)。

    【讨论】:

    • 我同意这些信息是有帮助的。但是,为了更有效地进行学习活动,新手应该/可以知道很多事情。从那个 PoV 来看,我们可以拒绝 99.9% 的问题,因为这些问题与解释“如何调试东西”的答案重复。
    • 我并没有贬低你的答案,我实际上可能是第一个标记它的人:) - 这是正确的。但他是第一次使用,我认为即使问题不是很突出,也可以提供一些一般性的调试帮助。我确实在当天发布了其中的一些,对基本调试的一些介绍对某人来说可能会有很长的路要走。如果它可以帮助某人了解它的价值:)。但是,是的......如果不是第一次使用,我会标记这个删除。
    • 我没有投反对票,相反...只是说,仅此而已 ;-)
    • 我认为你没有! :)
    【解决方案3】:

    参考: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();
    

    【讨论】:

    • 不是他的问题。他在问为什么他不能在第一个 nextLine() 返回的字符串上调用 nextLine(),其他答案已涵盖。
    • 您似乎只阅读了问题的标题。您的观点有效,但没有回答问题。
    • @GhostCat 感谢您指出我,我将编辑我的答案并尽可能再次提供帮助谢谢
    【解决方案4】:

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

    你写的相当于:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-09
      • 2013-07-09
      • 2012-08-15
      相关资源
      最近更新 更多