【问题标题】:Scanner only reads first word instead of line扫描仪只读取第一个单词而不是行
【发布时间】:2011-12-18 07:13:14
【问题描述】:

在我当前的程序中,一种方法要求用户输入产品描述作为String 输入。但是,当我稍后尝试打印此信息时,仅显示String 的第一个单词。这可能是什么原因?我的方法如下:

void setDescription(Product aProduct) {
    Scanner input = new Scanner(System.in);
    System.out.print("Describe the product: ");
    String productDescription = input.next();
    aProduct.description = productDescription;
}

因此,如果用户输入的是“橙味苏打水”,System.out.print 只会产生“Sparkling”。

任何帮助将不胜感激!

【问题讨论】:

    标签: java string java.util.scanner


    【解决方案1】:

    Javadoc 救援:

    扫描器使用分隔符模式将其输入分解为标记, 默认匹配空格

    nextLine 可能是您应该使用的方法。

    【讨论】:

      【解决方案2】:

      input.next() 接收输入字符串的第一个空格分隔的单词。因此,按照设计,它会按照您的描述进行。试试input.nextLine()

      【讨论】:

        【解决方案3】:

        javadocs for Scanner 回答您的问题

        扫描器使用分隔符模式将其输入分解为标记, 默认情况下匹配空格。

        您可以通过执行类似的操作来更改扫描器使用的默认空白模式

        Scanner s = new Scanner();
        s.useDelimiter("\n");
        

        【讨论】:

        • nextLine() 是专门针对这种情况编写的并且可以巧妙地解决所有问题,为什么还要搞砸呢?
        • @HovercraftFullOfEels 因为这在所有情况下都很有效,所以没有问题。它现在甚至可以读取空行。相比之下,nextLine 却以令人费解的方式失败了。例如当你这样做时:Scanner s = new Scanner(System.in); s.nextInt(); s.nextLine(); - 最后一个 nextLine 将始终返回一个空字符串。您无法通过添加额外的 nextLine 调用来修复它,因为现在如果用户输入由空格分隔的数据而不是输入,您的代码就会中断。那里没有简单的修复。更新分隔符,这种奇怪的事情根本不会发生,这就是为什么它是正确的答案。
        【解决方案4】:

        使用input.nextLine(); 而不是input.next();

        【讨论】:

          【解决方案5】:

          next() 替换为nextLine()

          String productDescription = input.nextLine();
          

          【讨论】:

          • 如果任何next() 调用在nextLine() 调用之前,这将失败。正确的答案是不要使用 nextLine(你很少需要 nextLine);相反,修复扫描仪的分隔符:创建后立即调用.useDelimiter("\r?\n");
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-05-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-08-11
          相关资源
          最近更新 更多