Scanner.hasNextInt()用于试探性判断下一个输入是否为合法整数,不消耗输入流,返回true时可安全调用nextInt();返回false时须用next()或nextLine()清除非法输入,否则导致死循环。

用 Scanner.hasNextInt() 可以在真正读取前检查用户输入是否为合法整数,避免因类型不匹配导致程序异常中断或逻辑错乱。它的核心作用是“试探性判断”,不消耗输入流,适合做输入校验和分支控制。
基本用法:先判断再读取
调用 hasNextInt() 返回 true 表示下一个输入项能被解析为 int(按当前区域设置),且该输入仍保留在缓冲区中;返回 false 则说明不是整数(可能是字母、小数、空行等)。此时应配合 next() 或 nextLine() 清除无效输入,否则会反复触发同一错误。
- ✅ 正确流程:
if (scanner.hasNextInt()) { int n = scanner.nextInt(); } - ❌ 错误写法:
scanner.nextInt()直接调用,未判断就可能抛InputMismatchException
处理非整数输入:跳过并提示
当 hasNextInt() 返回 false,说明用户输错了。不能直接忽略,必须用 scanner.next() 消费掉这个非法 token,否则下次循环还会检测到它,造成死循环。
while (!scanner.hasNextInt()) { System.out.print("请输入一个整数:"); scanner.next(); // 跳过非法输入 }- 也可用
scanner.nextLine()清空整行(适合允许用户输完回车后才校验的场景)
注意 Scanner 的换行符与分隔符行为
hasNextInt() 默认按空白符(空格、制表符、换行)切分输入。如果用户输入 "123abc",它不会识别为整数,因为整个 token 不符合整数格式;但输入 "123 abc" 时,hasNextInt() 会返回 true(第一个 token 是 "123")。
- 输入
"3.14"→hasNextInt()返回false(小数不是整数) - 输入
"-42"→ 返回true(支持带符号整数) - 输入空行或纯空格 → 返回
false,需用nextLine()吃掉
结合 hasNextLine() 实现更安全的交互
有时需要先确认是否有输入,再判断类型。例如用户可能直接按回车。可先用 hasNextLine() 确保有内容,再用 nextLine() 获取字符串,手动解析或重置 Scanner:
if (scanner.hasNextLine()) { String line = scanner.nextLine().trim(); if (!line.isEmpty() && line.matches("-?\d+")) { int n = Integer.parseInt(line); } }- 这种方式更可控,但失去 Scanner 自动解析的优势;适合对输入格式要求严格或需统一处理空行的场景










