
当使用scanner的nextint()或nextdouble()后紧跟nextline()时,nextline()会读取前一个输入操作遗留的换行符,导致返回空字符串,这是初学者最常见的输入处理陷阱。
当使用scanner的nextint()或nextdouble()后紧跟nextline()时,nextline()会读取前一个输入操作遗留的换行符,导致返回空字符串,这是初学者最常见的输入处理陷阱。
在Java中,Scanner类的nextInt()、nextDouble()等方法不会消费输入流末尾的换行符(\n),而nextLine()则专门用于读取从当前位置到下一个换行符之间的全部内容(包括空行)。因此,当代码按如下顺序执行时:
int i = scan.nextInt(); // 读取整数,例如输入"26" + 回车 → 光标停在换行符处 double d = scan.nextDouble(); // 读取浮点数,例如输入"35.64" + 回车 → 光标仍停在换行符处 String s = scan.nextLine(); // 立即读取当前换行符前的“空内容”,返回 ""
此时scan.nextLine()实际读取的是上一次输入(如nextDouble())后残留的换行符,结果s为空字符串——这正是你观察到“只打印第一个单词”或“看似跳过输入”的根本原因(注意:并非只取首词,而是根本没读到用户预期的句子;若后续还有输入,可能因逻辑错位造成误判)。
✅ 正确做法:在调用nextInt()或nextDouble()之后,显式添加一次scan.nextLine()作为“清空缓冲区”的占位操作:
Java开发手册规约集合,基于阿里巴巴Java开发手册(嵩山版)。 涵盖7大维度:编程规约、异常日志、单元测试、安全规约、MySQL数据库、工程结构、设计规约。 当用户需要:(1) 编写或审查Java代码 (2) 检查命名/代码规范 (3) 处理异常和日志 (4) 编写单元测试 (5) 安全编码 (6) 数据库设...
import java.util.Scanner;
public class Solution {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int i = scan.nextInt();
double d = scan.nextDouble();
scan.nextLine(); // ? 关键修复:消费掉残留的换行符
String s = scan.nextLine(); // ✅ 现在能正确读取整行文本(含空格)
System.out.println("String: " + s);
System.out.println("Double: " + d);
System.out.println("Int: " + i);
}
}
? 补充说明与最佳实践:
-
nextLine()是唯一能读取含空格字符串的Scanner方法;next()仅读取到首个分隔符(默认空格),故不适合读取句子; - 若需严格校验输入格式,建议统一使用
nextLine()配合Integer.parseInt()、Double.parseDouble()手动解析,避免混合使用带来的缓冲区干扰; - 在生产代码中,务必对
parseXXX()调用做try-catch异常处理,防止用户输入非数字导致InputMismatchException或NumberFormatException; -
Scanner对象使用完毕后,可调用scan.close()释放资源(尤其在频繁创建Scanner的场景下)。
掌握这一缓冲区机制,不仅能解决当前问题,更能避免大量交互式输入程序中的隐蔽Bug。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










