Scanner.hasNextInt()用于预判输入是否为整数而不消耗token,返回true时方可安全调用nextInt();校验失败需用next()清除非法token,否则会持续阻塞。

Scanner.hasNextInt() 是 Java 中用于预判输入是否为整数的便捷方法,它不会真正读取数据,只做类型检查,配合 Scanner.nextInt() 使用可避免因非法输入导致的 InputMismatchException。
基本用法:先判断再读取
调用 hasNextInt() 返回 true 时,说明当前输入的 token(以空白符分隔)能被解析为 int 类型;此时再调用 nextInt() 才安全。
- 如果输入是
"123"、"-45",hasNextInt()返回true - 如果输入是
"abc"、"3.14"、""或已到输入末尾,返回false - 注意:该方法不跳过输入,也不消耗 token;连续调用两次
hasNextInt()结果一致
典型场景:安全读取用户输入的整数
常用于控制台交互中防止程序崩溃。例如要求用户输入年龄:
Scanner sc = new Scanner(System.in);
System.out.print("请输入年龄:");
if (sc.hasNextInt()) {
int age = sc.nextInt();
System.out.println("您输入的年龄是:" + age);
} else {
System.out.println("输入无效,请输入一个整数。");
sc.next(); // 跳过非法 token,否则下次 hasNextInt() 还会返回 false
}
关键点:若校验失败,必须调用 sc.next() 或 sc.nextLine() 清除错误输入,否则 Scanner 会一直卡在同一个非法 token 上。
进阶技巧:指定进制或处理多类型混合输入
hasNextInt(int radix) 可判断是否为指定进制的整数(如二进制、十六进制):
-
sc.hasNextInt(16)对"FF"或"a1"返回true -
sc.hasNextInt(2)对"1010"返回true,但对"2"返回false
当输入流中混有数字和字符串(如 "42 hello 3.14"),可用 hasNextInt() 精准定位并提取所有整数,跳过其他内容。
常见误区提醒
- 不要在
hasNextInt()为false后直接调用nextInt(),这会抛出异常 -
hasNextInt()不识别带空格的字符串(如" 123 "),但 Scanner 默认自动跳过前导/尾随空白,所以实际不影响判断 - 它只检查下一个 token,不负责整行校验;如需整行是纯整数,应先用
nextLine()获取字符串,再用Integer.parseInt()尝试解析并捕获异常
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











