在 java 中读取 int 和 double 后,需要调用 nextLine() 三次才能读取字符串

Call to nextLine() needed thrice for reading a string after it has read int and double in java

提问人:Naman Sharma 提问时间:6/8/2022 最后编辑:Naman Sharma 更新时间:6/8/2022 访问量:63

问:

import java.util.Scanner;

public class Solution {
    public static void main(String[] args) {
        /* Read input */
        Scanner scan = new Scanner(System.in);
        int i    = scan.nextInt();
        double d = scan.nextDouble();
        scan.nextLine();              // gets rid of the pesky newline
        String s = scan.nextLine();
        scan.close();
        
        /* Print output */
        System.out.println("String: " + s);
        System.out.println("Double: " + d);
        System.out.println("Int: " + i);
    }
}

上面的代码在 hackerrank 编译器中运行良好。而如果我在 IntelliJ 上运行它,则需要对 scan.nextLine() 进行一次额外的调用才能读取实际的字符串。

import java.util.Scanner;

public class Solution {
    public static void main(String[] args) {
        /* Read input */
        Scanner scan = new Scanner(System.in);
        int i    = scan.nextInt();
        double d = scan.nextDouble();
        scan.nextLine();              // gets rid of the pesky newline
        scan.nextLine();              // gets rid of the pesky newline
        String s = scan.nextLine();
        scan.close();

        /* Print output */
        System.out.println("String: " + s);
        System.out.println("Double: " + d);
        System.out.println("Int: " + i);
    }
}

有人可以帮我解释为什么会发生这种情况吗?我假设对 nextDouble() 的调用将忽略 nextInt() 在缓冲区中留下的 \n,并拾取下一个双精度标记并在缓冲区中保留一个新的 \n。因此,对 nextLine() 的单个调用应该足以从缓冲区中清除该 \n,但是当我在 IntelliJ 上运行它时,为什么需要 2 次调用。

这是JAVA版本问题,还是我缺少一些非常基本的东西?

java.util.scanner 用户输入

评论

0赞 Anonymous 6/8/2022
我相信这是一个 IntelliJ IDEA 错误,并且之前已经问过。
0赞 cyberbrain 6/8/2022
你们的IDEA版本是什么?
0赞 Naman Sharma 6/8/2022
它是 IntelliJ IDEA 2022.1.1(运行时版本:11.0.14.1+1-b2043.45 x86_64)
0赞 Naman Sharma 6/8/2022
那我应该忽略这个问题吗?只使用一次nextLine()就足够了吗?

答:

1赞 cyberbrain 6/8/2022 #1

你可能看到了这个官方 IDEA 问题的影响:控制台 readLine 跳过 2022.1.1 中的输入

您可以更新到 2022.1.2,其中此问题已修复。