发布于2026-07-06 阅读(0)
扫一扫,手机访问
在Ja va里,Scanner.hasNextInt()是个挺实用的小工具——它专门用来“预检”一下输入流里下一个待处理的内容,看看是不是一个合法的整数。关键点是:它只检查,不消耗输入,所以不会影响后续的读取操作。用好它,能很干净地避开InputMismatchException这类运行时异常,让程序的健壮性上一个台阶。
这个方法会检查扫描器的“下一个标记”(也就是next token)能否被解析成int类型。判断规则很简单:默认只认十进制格式,可以带正负号,但不接受科学计数法,也不认前导的0(八进制)或0x(十六进制)。最重要的是,它不会移动输入指针,只是返回一个true或false的结果。
"123" → 返回 true"-456" → 返回 true"0x1A"、"12.3"、"abc"、"123abc" → 统统返回 false" 789 "(前后有空格)→ 返回 true(Scanner默认会自动跳过前导空白符)实际使用时,一般都是“先判后取”——先用hasNextInt()问一声,确认没问题了再调用nextInt()去拿数据。这样流程就不会被异常打断:
Scanner sc = new Scanner(System.in);
if (sc.hasNextInt()) {
int value = sc.nextInt(); // 既然前面已经判断过了,这里调用必然成功
System.out.println("读取到整数:" + value);
} else {
System.out.println("输入不是有效整数");
sc.next(); // 跳过这个非法token,否则下一次循环还会卡在这里
}
有个小细节值得注意:如果判断失败后没有调用sc.next()或sc.nextLine()把那个非法输入“吃掉”,那么下一次hasNextInt()还是会检测到同一个错误token,你就会陷入死循环——光是判断它,永远不肯往前挪一步。
很多时候,用户会在命令行菜单里既输入数字指令又输入字符串(比如“3”表示执行操作,“help”表示查看帮助)。这时候就得靠hasNextInt()来分类处理:
nextInt()拿数值。nextLine()把整行读走——尤其是后面还要读字符串的时候,next()容易留下换行符搞事情。这种“先判再分发”的模式,在处理交互式程序时特别顺手,能帮你把不同类型的数据有序地分拣到各自的逻辑分支里。
首先,hasNextInt()默认只认十进制,而且它的判断行为受Locale的影响——有些地区用逗号作为小数点,虽然对整数判断没太大影响,但如果你切换了Locale,某些边界行为可能会变。如果你想支持其他进制,可以用它的重载版本hasNextInt(int radix),比如hasNextInt(16)就能判断一个字符串是不是合法的十六进制整数。
另外一个常见的坑:它识别不了超出int范围的数字。比如"2147483648"(刚好比Integer.MAX_VALUE大1),这个方法会返回false——因为那个值已经没法塞进一个int变量里了。遇到这种情况,你就得考虑改用hasNextLong()来兜底了。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8