java中scanner类是控制台输入最常用工具,封装system.in支持按词、行、类型读取,但需处理换行符残留和异常;推荐nextline()配合parse转换,并注意关闭、线程安全及编码问题。

Java 中 Scanner 类是实现控制台输入最常用、最直观的工具,适合初学者快速构建人机交互逻辑。它封装了 System.in,能按词(next)、按行(nextLine)、按类型(nextInt、nextDouble 等)安全读取输入,但需注意换行符残留和异常处理等细节。
基本用法:创建 Scanner 并读取不同类型的输入
Scanner 对象需关联 System.in,并在使用完毕后关闭(尤其在非 main 方法中建议显式 close)。常用读取方法包括:
- nextLine():读取整行(含空格),推荐用于字符串输入,且通常应放在其他 nextXxx() 之后用于消费残留换行符
- next():只读取下一个单词(以空白符分隔),遇到空格或回车即停止
- nextInt() / nextDouble() / nextBoolean():读取对应基本类型,但不会跳过后续换行符——这是常见 bug 来源
避免 nextInt() 后 nextLine() 被跳过的陷阱
当调用 nextInt() 后紧跟 nextLine(),后者常会“读到空行”,因为 nextInt() 只读数字,不消耗其后的换行符(\n),而 nextLine() 遇到 \n 就立即返回空字符串。解决方式有两种:
- 在 nextInt() 后加一句 scanner.nextLine() 手动清掉换行符
- 统一用 nextLine() 读入字符串,再用 Integer.parseInt() 等转换——更安全,也便于校验输入格式
简单人机交互示例:带提示与基础校验的学生成绩录入
以下是一个健壮性稍强的交互片段,包含提示、类型转换保护和重试机制:
Scanner sc = new Scanner(System.in);
System.out.print("请输入学生姓名: ");
String name = sc.nextLine().trim();
int score = -1;
while (score 100) {
System.out.print("请输入成绩(0–100): ");
String input = sc.nextLine().trim();
try {
score = Integer.parseInt(input);
} catch (NumberFormatException e) {
System.out.println("❌ 输入不是有效数字,请重试");
}
if (score 100) {
System.out.println("❌ 成绩应在 0 到 100 之间,请重试");
}
}
System.out.printf("✅ 已录入:%s 的成绩为 %d 分\n", name, score);
sc.close();
注意事项与最佳实践
实际开发中还需留意:
- Scanner 不是线程安全的,多线程环境下应避免共享实例
- 在 try-with-resources 中管理 Scanner(如读文件时),但控制台输入一般无需自动关闭,否则可能影响后续 System.in 使用
- 用户输入不可信,所有 nextXxx() 均可能抛出 InputMismatchException,建议配合 hasNextXxx() 预判或用 try-catch 包裹
- 中文系统下注意控制台编码(如 Windows 默认 GBK),若出现乱码,需确保 IDE 和终端编码一致,Scanner 本身不处理编码问题
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











