根本原因是nextint()等方法不消费换行符,而nextline()会读取残留的换行符导致空字符串;解决方法是在nextxxx()后立即调用sc.nextline()清理缓冲区,或统一使用nextline()配合类型转换。

Java 中 Scanner 连续读取不同类型数据(比如先读 int 再读 String)时,回车符(\n)常被遗留为下一次读取的“空字符串”或导致跳过输入,根本原因是 nextXXX() 方法(如 nextInt()、nextDouble())**不消费换行符**,而 nextLine() 会读取包括换行符在内的整行——所以它会立刻“吃掉”前面留下的那个回车。
问题典型表现
例如:
Scanner sc = new Scanner(System.in);
System.out.print("年龄:");
int age = sc.nextInt();
System.out.print("姓名:");
String name = sc.nextLine(); // ← 这里直接返回空字符串!
用户输入 25↵张三↵ 后,name 得到的是空串,光标停在“张三”前,看似没读取成功。
解决方法:手动清理缓冲区中的换行符
在调用 nextInt()、nextDouble() 等非 nextLine() 方法后,**立即加一句 sc.nextLine()**,专门用来吸收残留的换行符:
sc.nextInt(); sc.nextLine();sc.nextDouble(); sc.nextLine();-
sc.next(); sc.nextLine();(如果next()后要接整行输入)
修正后的代码:
Scanner sc = new Scanner(System.in);
System.out.print("年龄:");
int age = sc.nextInt();
sc.nextLine(); // ← 关键:吃掉回车
System.out.print("姓名:");
String name = sc.nextLine(); // ← 正常读取“张三”
更稳妥的做法:统一用 nextLine() + 类型转换
避免混用读取方法,全程使用 nextLine(),再对字符串做解析:
- 读整数:
int age = Integer.parseInt(sc.nextLine().trim()); - 读浮点数:
double price = Double.parseDouble(sc.nextLine().trim()); - 读布尔值:
boolean flag = Boolean.parseBoolean(sc.nextLine().trim());
优点是逻辑清晰、无换行符干扰;缺点是需自行处理异常(如输入非数字),建议配合 try-catch 使用。
注意 next() 和 nextLine() 的行为差异
next():只读取到下一个空白符(空格、制表、换行)前的内容,**不包含换行符,也不跳过开头空白**(但会自动跳过前导空白);nextLine():读取从当前位置到换行符之前的所有字符(不含换行符),并把扫描器位置移到下一行开头。
所以 next() 后若接 nextLine(),也需加一次 sc.nextLine() 清缓冲,否则仍会读到空行。
不复杂但容易忽略。关键就是记住:只要用了 nextXXX()(除了 nextLine()),后面紧跟着要读整行,就补一行 sc.nextLine() 来“清道”。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











