扫描器仅读取第一个单词而非整行文本

19

在我的当前程序中,一个方法要求用户输入产品描述作为 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"。

感谢任何帮助!

5个回答

28

next() 替换为 nextLine()

String productDescription = input.nextLine();

1
如果在 nextLine() 调用之前有任何 next() 调用,这将失败。正确的答案不是使用 nextLine(你很少需要 nextLine);相反,修复你的扫描器的分隔符:在其创建后立即调用 .useDelimiter("\r?\n"); - rzwitserloot

9
使用 input.nextLine(); 替代 input.next();

5
Scanner的Java文档可以回答您的问题。
一个扫描仪使用分隔符模式将其输入拆分为标记,默认情况下匹配空格。您可以通过以下方法更改Scanner正在使用的默认空格模式:
Scanner s = new Scanner();
s.useDelimiter("\n");

2
为什么要折腾呢?nextLine() 特别为这种情况编写,能够完美解决。 - Hovercraft Full Of Eels
@HovercraftFullOfEels 因为这种方法在所有情况下都非常有效,没有任何问题。它甚至可以读取空行。相比之下,nextLine的表现令人困惑。例如当您执行以下操作时:Scanner s = new Scanner(System.in); s.nextInt(); s.nextLine(); - 最后一个 nextLine 将始终返回一个空字符串。您无法通过添加额外的 nextLine 调用来修复它,因为如果用户输入的数据是由空格而不是回车分隔的,则代码将会出错。没有简单的解决方案。更新分隔符,这种奇怪的情况就不会发生,这就是为什么这是正确的答案。 - rzwitserloot

1

input.next()接收输入字符串中第一个以空格分隔的单词。因此,它按照您所描述的方式运行。请尝试使用input.nextLine()


0

Javadoc 来拯救:

一个 Scanner 使用分隔符模式将其输入分解为标记,该模式默认匹配空格

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接