【问题标题】:Scanner nextLine issue in Java [duplicate]Java中的扫描仪nextLine问题[重复]
【发布时间】:2014-10-09 14:37:07
【问题描述】:

只有一个问题:为什么我必须输入两次answer = in.nextLine();?如果此行是单行,则程序无法按预期工作。如果没有第二行,程序不会要求您输入字符串。

public class Main {

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String answer = "Yes";

        while (answer.equals("Yes")) {
            System.out.println("Enter name and rating:");
            String name = in.nextLine();
            int rating = 0;

            if (in.hasNextInt()) {
                rating = in.nextInt();
            } else {
                System.out.println("Error. Exit.");
                return;
            }

            System.out.println("Name: " + name);
            System.out.println("Rating: " + rating);
            ECTS ects = new ECTS();
            rating = ects.checkRating(rating);
            System.out.println("Enter \"Yes\" to continue: ");
            answer = in.nextLine();
            answer = in.nextLine();
        }

        System.out.println("Bye!");
        in.close();
    }
}

【问题讨论】:

  • 你不需要写两次。 o.o
  • nextInt() 留下一个换行符。您的第一个 nextLine() 将吞噬它。第二个nextLine() 将读取您的yes 数据
  • @Zhuinden - 他正在使用nextInt(),他将不得不使用。
  • @TheLostMind 哦,这就像 C 语言中 scanf 的问题。我总是使用 BufferedReader,所以我没有遇到过这样的问题。感谢您的回答!
  • @Zhuinden - Scanner 通常用于解析FileReader/BufferedReader 通常用于阅读

标签: java java.util.scanner


【解决方案1】:

Scanner-Object 有一个内部缓存。

  1. 您开始扫描nextInt()
  2. 您按下键 1
  3. 您按下键 2
  4. 你按 return

现在,内部缓存有 3 个字符,扫描器发现第三个字符 (return) 不是数字,所以 nextInt() 只会返回第一个和第二个字符的整数 ( 1,2=12)。

  1. nextInt() 返回 12。

不幸的是,return 仍然是 Scanner 缓存的一部分。

  1. 您调用了nextLine(),但该方法会扫描其缓存中的newline-标记,该标记在nextInt() 调用返回之前已保存在缓存中。

  2. nextLine() 返回一个长度为 0 的字符串。

  3. 下一个nextLine() 有一个空缓存!它将等到缓存被下一个newline-marker 填充。

重置()

有一种更优雅的方式来清除缓存而不是使用nextLine()

in.reset();

【讨论】:

    【解决方案2】:

    因为您使用的是 nextInt(),所以此方法只抓取下一个 int,它不会消耗 \n 字符,因此下次执行 nextLine() 时,它会完成消耗该行然后移至下一行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-31
      • 1970-01-01
      • 2012-10-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多