Java中如何在while循环内正确使用Scanner实现循环输入校验
Java控制台菜单输入校验正确实现
原有代码问题定位
- 第一版编译报错:
while循环内部重复用int声明firstSelection变量,和循环外的同名变量作用域冲突。循环内只需要给外部已定义的变量重新赋值,不需要再加类型声明。 - 第二版运行异常:
- 错误地把存储输入值的变量定义为
boolean类型,最终拿到的是判断结果而非用户输入的整数值 - 循环判断逻辑中写了两次
scanner.nextInt(),单次校验会读取两次用户输入,逻辑完全错乱 - 没有做非整数输入兼容,用户输入字母、符号时会直接触发输入类型不匹配异常,甚至进入死循环
- 错误地把存储输入值的变量定义为
可直接运行的正确实现
public static void main(String[] args) { Scanner scanner = new Scanner(System.in); // 打印菜单选项 System.out.println("1 - login"); System.out.println("2 - register"); int firstSelection = -1; // 输入值不在1-2合法区间时持续循环 while (firstSelection < 1 || firstSelection > 2) { // 非首次进入循环说明上一次输入无效,打印错误提示 if (firstSelection != -1) { System.out.println(firstSelection + " is not a valid entry"); } // 先判断输入是否为整数,避免非数字输入导致程序崩溃 if (scanner.hasNextInt()) { firstSelection = scanner.nextInt(); } else { // 清空缓冲区中的非法输入,防止重复读取无效值死循环 scanner.next(); firstSelection = -1; } } System.out.println("you picked " + firstSelection); scanner.close(); }
逻辑说明
- 仅在循环外声明一次
int类型的firstSelection变量,初始值设为合法区间外的-1,用来标记首次进入循环的状态,避免重复声明的编译错误 - 循环内直接对已定义的
firstSelection赋值,不做重复声明 - 增加非整数输入处理:如果用户输入的不是数字,先调用
scanner.next()把缓冲区里的无效内容清空,再给变量赋非法值让循环继续,不会出现死循环或崩溃问题 - 只有当
firstSelection被赋值为1或2时,循环才会终止,保证后续逻辑拿到的一定是合法输入
内容的提问来源于stack exchange,提问作者jgrewal
相关产品推荐
相关产品推荐

