Java整数输入验证While循环异常:预期循环一次却触发三次
问题分析与解决方案
你遇到的问题有两个核心原因:
- Scanner的
next()方法是按空白字符(空格、回车等)分割输入的,当你输入"my first mistake"时,这是3个独立的输入单元(token),每次next()只会读取一个,三次读取的内容都不符合数字规则,所以循环触发三次。 - 你的while循环内部没有重新校验输入合法性,就算后续输入了正确数字,
isNumeric仍保持初始的false值,循环无法终止。
修复方案
- 改用
nextLine()读取整行输入,避免输入被空格分割; - 在循环内部每次读取新输入后,重新执行合法性校验,更新
isNumeric状态; - 如果你只需要验证整数,要修正正则表达式(原正则会匹配小数)。
修复后的代码
import java.util.Scanner; public class validInput { public static void main(String[] args) { Scanner key = new Scanner(System.in); String num; boolean isNumeric; System.out.print("Enter a number: "); // 读取整行输入,避免被空格拆分 num = key.nextLine(); // 正则匹配整数(允许负号) isNumeric = num.matches("-?\\d+"); while (!isNumeric) { System.out.println("You must enter an integer"); num = key.nextLine(); // 每次输入后重新校验合法性 isNumeric = num.matches("-?\\d+"); } System.out.print("Valid"); key.close(); } }
补充说明
- 原正则
-?\\d+(\\.\\d+)?会匹配整数和小数,若需求仅为整数,需改为-?\\d+; - 使用
nextLine()时,若之前调用过next()/nextInt()等方法,需先处理残留的换行符,本案例中直接用nextLine()开头无此问题; - 用完Scanner后调用
close()是良好的资源释放习惯。
测试时输入"my first mistake"只会触发一次循环提示,输入合法整数后程序会输出Valid。
内容的提问来源于stack exchange,提问作者ennie Ayeni
相关产品推荐
相关产品推荐

