Scanner.hasNextInt()用于预检输入是否为合法十进制整数,不消耗输入流,返回true或false;典型用法是“先判后取”,避免InputMismatchException,并需在判断失败时调用next()或nextLine()清理非法token。

在 Java 中,Scanner.hasNextInt() 是一个用于预检输入是否为合法整型的便捷方法,它不会消耗输入流中的内容,只做类型判断。正确使用它能有效避免 InputMismatchException,提升程序健壮性。
hasNextInt() 的核心行为
该方法检查扫描器当前“下一个标记”(next token)能否被解析为 int 类型,依据的是默认的数字格式(十进制、可带正负号、不支持科学计数法或前导零八进制/十六进制)。它不读取也不跳过任何字符,仅返回 true 或 false。
- 输入
"123"→ 返回true - 输入
"-456"→ 返回true - 输入
"0x1A"、"12.3"、"abc"、"123abc"→ 均返回false - 输入
" 789 "(含空格)→ 返回true(Scanner 自动跳过前导空白)
典型安全读取整数的写法
配合 next() 或 nextInt() 使用,实现“先判后取”,避免异常中断流程:
Scanner sc = new Scanner(System.in);
if (sc.hasNextInt()) {
int value = sc.nextInt(); // 此时调用 nextInt() 必然成功
System.out.println("读取到整数:" + value);
} else {
System.out.println("输入不是有效整数");
sc.next(); // 跳过非法 token,防止死循环
}
注意:若判断失败却未调用 sc.next() 或 sc.nextLine() 清除非法输入,下一次 hasNextInt() 仍会检测到同一个错误 token,导致逻辑卡住。
立即学习“Java免费学习笔记(深入)”;
当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。
处理多类型混合输入的常见场景
当用户可能交替输入整数与字符串(如命令行菜单),需主动清理缓冲区:
- 用
hasNextInt()判断是否为整数指令 - 是 → 调用
nextInt()获取值 - 否 → 用
nextLine()读走整行(尤其当后续需要读字符串时,避免next()留下换行符干扰)
例如菜单选择中,用户输入 "3" 执行操作,输入 "help" 显示帮助 —— 此时不能只依赖 next(),而应先判再分发。
注意事项与局限性
hasNextInt() 默认按十进制解析,且受 Locale 影响(如某些区域设置用逗号作小数点,虽不影响整数判断,但切换 locale 后行为可能变化)。如需支持其他进制,可使用 hasNextInt(int radix),例如 hasNextInt(16) 判断是否为合法十六进制整数字符串。
它无法识别超出 int 范围的大数(如 "2147483648"),这类输入会返回 false,因为已超过 Integer.MAX_VALUE。

















