Java中的扫描程序nextLine问题

时间:2014-10-09 14:37:07

标签: java java.util.scanner

只有一个问题:为什么我必须两次输入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();
    }
}

2 个答案:

答案 0 :(得分:3)

Scanner-Object有一个内部缓存。

  1. 您开始扫描nextInt()
  2. 您按下 1
  3. 您按下 2
  4. 您按 return
  5. 现在,内部缓存有3个字符,扫描器看到第三个字符( return )不是数字,因此nextInt()只返回第1个和第2个整数字符( 1 2 = 12)。

    1. nextInt()返回12。
    2. 不幸的是, return 仍然是Scanner缓存的一部分。

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

      2. nextLine()返回0长度字符串。

      3. 下一个nextLine()有一个空缓存!它会等到缓存填满下一个newline - 标记。
      4. 复位()

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

        in.reset();
        

答案 1 :(得分:2)

因为你正在使用nextInt()这个方法只抓取下一个int,它不会消耗\ n字符,所以下次你执行nextLine()时它会完成消耗该行,然后移动到下一行。