当使用nextint()或nextdouble()后紧跟nextl

在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);
}
}⚠️ 注意事项:
- 不要依赖 scan.skip("\\R") 或正则跳过——它不可靠且易出错;
- 若需读取带空格的字符串(如 "Hello World"),nextLine() 是唯一正确选择;next() 会因空格截断;
- 在循环中重复读取时,务必为每个 nextXXX() 配套 nextLine() 清理(除非后续仍用 nextXXX());
- 更健壮的替代方案是统一使用 nextLine() + 字符串解析(如 Integer.parseInt(scan.nextLine())),可完全规避缓冲区干扰。
总结:Scanner 的混合输入必须注意缓冲区状态。牢记——nextXXX() 不吞换行符,nextLine() 专吃换行符。一次主动清理,即可确保后续字符串输入准确无误。








