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,导致逻辑卡住。
处理多类型混合输入的常见场景
当用户可能交替输入整数与字符串(如命令行菜单),需主动清理缓冲区:
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
- 用
hasNextInt()判断是否为整数指令 - 是 → 调用
nextInt()获取值 - 否 → 用
nextLine()读走整行(尤其当后续需要读字符串时,避免next()留下换行符干扰)
例如菜单选择中,用户输入 "3" 执行操作,输入 "help" 显示帮助 —— 此时不能只依赖 next(),而应先判再分发。
注意事项与局限性
hasNextInt() 默认按十进制解析,且受 Locale 影响(如某些区域设置用逗号作小数点,虽不影响整数判断,但切换 locale 后行为可能变化)。如需支持其他进制,可使用 hasNextInt(int radix),例如 hasNextInt(16) 判断是否为合法十六进制整数字符串。
它无法识别超出 int 范围的大数(如 "2147483648"),这类输入会返回 false,因为已超过 Integer.MAX_VALUE。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










