【问题标题】:How to fix nextLine error so that both words are printed? [duplicate]如何修复 nextLine 错误以便打印两个单词? [复制]
【发布时间】:2020-01-04 11:57:56
【问题描述】:

下面的代码在运行时运行良好,但如果您在“bands”问题中输入两个单词,您只会得到一个打印回来。

import java.util.Scanner;
public class Main {
  public static void main(String[] args) {
    Scanner scan = new Scanner(System.in);
    System.out.println("What is your name?");
    String name;
    name = scan.next();
    System.out.println("Hello " + name);
    System.out.println("What is your age?");
    int years;
    years = scan.nextInt();
    int ageInMonths;
    ageInMonths = years * 12;
    System.out.print("Your age is ");
    System.out.print(ageInMonths);
    System.out.println(" in months");
    System.out.println("What are your favorite two bands?");
    String bands = scan.next();
    System.out.println("I like >>" + bands + "<<too!");
  }
}

【问题讨论】:

  • 用户 scan.nextLine() instad of next();
  • 如果你使用 scan.nextLine 而不是 next,它不会给你回应的机会
  • 如链接中的帖子中所述,您必须从以前的读数中删除换行符(请参阅下面的答案)

标签: java


【解决方案1】:

Scanner 类中的方法 next() 将只返回下一个标记。

如 oracle 文档中所写:

从这个扫描器中查找并返回下一个完整的令牌。一种 完整的令牌之前和之后是匹配的输入 分隔符模式。此方法可能会在等待输入时阻塞 扫描,即使之前调用 hasNext() 返回 true。

默认分隔符是空格,所以如果您的乐队名称包含多个单词,它将不起作用。

用于读取整行输入用户nextLine()

如果您想分别拥有两个乐队名称,请致电nextLine() 两次以分别获取每个输入:

System.out.println("What are your favorite two bands?");
String band1 = scan.nextLine();
String band2 = scan.nextLine();
System.out.println("I like >>" + band1 + " and " + band2 + "<<too!");

在这种情况下,用户必须在每次输入后按“输入”。

编辑:

正如 Elliott Frisch 的评论中提到的,其他 readXXX 方法不会从输入流中删除 lineendings。 看: stackoverflow.com/q/13102045/2970947

您可以对每个输入使用 nextLine() 或在每次读取后删除换行符。示例代码:

    Scanner scan = new Scanner(System.in);
    System.out.println("What is your name?");
    String name;
    name = scan.next();
    scan.nextLine();
    System.out.println("Hello " + name);
    System.out.println("What is your age?");
    int years;
    years = scan.nextInt();
    scan.nextLine();
    int ageInMonths;
    ageInMonths = years * 12;
    System.out.print("Your age is ");
    System.out.print(ageInMonths);
    System.out.println(" in months");
    System.out.println("What are your favorite two bands?");
    String bands = scan.nextLine();
    System.out.println("I like >>" + bands + "<<too!");

API 参考:

next()

nextLine()

【讨论】:

    【解决方案2】:

    要获得包含多个单词的完整字符串(直到enter 按下),您应该使用scan.nextLine() 而不是scan.next()scan.next() 仅用于读取下一个单词)。

    不要忘记在 scan.nextInt()and beforescan.nextLine()` 之后添加一个额外的 scan.nextLine()(参见 Java Scanner class reading strings):

    public static void main(String... args) {
        try (Scanner scan = new Scanner(System.in)) {
            System.out.print("What is your name? ");
            String name = scan.nextLine();
            System.out.println("Hello " + name);
    
            System.out.print("What is your age? ");
            int years = scan.nextInt();
            int ageInMonths = years * 12;
            System.out.println("Your age is " + ageInMonths + " in months");
    
            System.out.print("What are your favorite two bands? ");
            scan.nextLine();    // extra one after scan.nextInt() - it retrieves a empty string
            String bands = scan.nextLine();
            System.out.println("I like >>" + bands + "<< too!");
        }
    }
    

    演示,控制台输出:

    What is your name? John Doe
    Hello John Doe
    What is your age? 666
    Your age is 7992 in months
    What are your favorite two bands? one two three
    I like >>one two three<< too!
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-10-11
      • 2020-11-08
      • 2019-11-12
      • 1970-01-01
      • 1970-01-01
      • 2018-04-05
      • 1970-01-01
      相关资源
      最近更新 更多