贝利信息

Java中Scanner.nextLine()跳过输入的解决方案

日期:2026-01-19 00:00 / 作者:心靈之曲

当使用nextint()或nextdouble()后紧跟nextline()时,nextline()会读取前一个方法遗留的换行符而直接返回空字符串,导致输入被“跳过”;正确做法是在读取基本类型后手动调用一次nextline()清空缓冲区。

在Java中,Scanner类的nextLine()方法以换行符(\n)为终止符,读取从当前光标位置到下一个换行符之间的所有字符(不包括换行符本身)。而nextInt()、nextDouble()等nextXxx()方法仅读取匹配的数值,不会消费其后的换行符——该换行符仍滞留在输入缓冲区中。

因此,当执行以下代码时:

int i = scan.nextInt();      // 用户输入 "42" + 回车 → 缓冲区剩余: "\n"
double d = scan.nextDouble(); // 用户输入 "3.14" + 回车 → 缓冲区剩余: "\n"
String s = scan.nextLine();  // 立即读到 "\n",返回空字符串 "",光标已越过该换行符

nextLine() 实际读取的是上一次输入操作残留的换行符,而非用户期望的新一行字符串,造成“跳过输入”的错觉。

✅ 正确修复方式:在每次调用 nextXXX() 后,显式调用一次 scan.nextLine() 清空缓冲区中的残留换行符,再进行真正的字符串读取:

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);

        System.out.print("Enter an integer: ");
        int i = scan.nextInt();
        scan.nextLine(); // ✅ 消耗掉nextInt()留下的换行符

        System.out.print("Enter a double: ");
        double d = scan.nextDouble();
        scan.nextLine(); // ✅ 消耗掉nextDouble()留下的换行符

        System.out.print("Enter a string: ");
        String s = scan.nextLine(); // ✅ 现在能正确读取用户输入的整行字符串

        scan.close();

        System.out.println("\nString: \"" + s + "\"");
        System.out.println("Double: " + d);
        System.out.println("Int: " + i);
    }
}

⚠️ 注意事项:

总结:Scanner 的混合输入必须注意缓冲区状态。牢记——nextXXX() 不吞换行符,nextLine() 专吃换行符。一次主动清理,即可确保后续字符串输入准确无误。