java中scanner类常用但需注意缓冲区残留问题:nextint()等不消费换行符,导致后续nextline()读空;推荐统一用nextline()配合parsexxx()转换,并用hasnextxxx()校验输入。

Java 中 Scanner 类是接收用户输入最常用的方式,它能方便地读取字符串、整数、浮点数、布尔值等各类数据,但要注意方法调用顺序和缓冲区残留问题。
基本使用:创建 Scanner 对象并关联输入源
通常从标准输入(键盘)读取数据,需传入 System.in:
Scanner sc = new Scanner(System.in);
用完后建议关闭(尤其在读取文件时),但对 System.in 关闭需谨慎,可能影响后续输入 —— 一般交互式程序中可不关,或确保只关一次。
读取不同数据类型的常用方法
每种类型对应一个 nextXxx() 方法,注意它们的行为差异:
- nextLine():读取一整行(含空格),遇到回车结束;会消费掉换行符
- nextInt() / nextDouble() / nextBoolean() 等:只读取下一个“有效 token”(按空白符分割),**不消费换行符** —— 这是常见 bug 来源
- next():读取下一个单词(遇空格/制表符/换行停止),不带空格
例如:
int age = sc.nextInt();
String name = sc.nextLine(); // ❌ 此处会直接返回空字符串!
因为 nextInt() 留下了换行符,nextLine() 立刻读到它就结束了。
安全读取混合类型(推荐做法)
避免换行符残留问题,统一用 nextLine() 读取字符串,再手动转换:
- 读整数:int x = Integer.parseInt(sc.nextLine().trim());
- 读浮点数:double y = Double.parseDouble(sc.nextLine().trim());
- 读布尔值:boolean b = Boolean.parseBoolean(sc.nextLine().trim());
- 需要校验时,用
try-catch捕获NumberFormatException
这样逻辑清晰、不易出错,也便于处理空输入或格式异常。
判断是否有下一项输入(防止 NoSuchElementException)
在调用 nextXxx() 前,先用对应 hasNextXxx() 判断:
if (sc.hasNextInt()) {
int n = sc.nextInt();
} else {
System.out.println("请输入一个整数");
sc.next(); // 跳过非法输入
}
这对交互式输入很实用,能提升程序健壮性。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











