java - Java 中的扫描器 nextLine 问题

标签 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();
    }
}

最佳答案

Scanner-Object 有一个内部缓存。

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

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

  1. nextInt() 返回 12。

不幸的是,return 仍然是扫描器缓存的一部分。

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

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

  3. 下一个 nextLine() 有一个空缓存!它将等到缓存已被下一个 newline 标记填满。

重置()

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

in.reset();

关于java - Java 中的扫描器 nextLine 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26281220/

相关文章:

java - Java 中的 OpenFile 对话框给出 null 作为响应

java - Java中的扫描仪可以从对话框中读取文本吗

java - unicode-16 中的 nextLine() 和 while 循环错误行为

java - 是否可以使用 AOP 进行 Web 应用程序许可证验证?

java在内部函数中调用父级的回调函数

java - 为什么这个大型Java项目需要common-ant.xml来构建?

Java:传递实际的 <T extends Event> 类。 (泛型问题)

java - 从 Scanner 将数字添加到数组

java - 使用垂直空白字符作为 java 扫描器分隔符在每个末尾扫描空字符串

java - 使用 OAI-PMH 从机构存储库获取数据