Java中for循环满足终止条件却无法停止的问题求助
问题分析与修复方案
你的代码出现无限输入的问题,主要有三个关键问题:
1. Scanner对象混用导致输入处理混乱
代码里同时用了scan、sc、scanner三个不同的Scanner引用,这会导致输入缓冲区的读取逻辑混乱,比如某个Scanner没有正确读取输入,使得nextInt()一直阻塞等待用户输入,看起来像是for循环无法终止。
2. 选项2执行完成后未更新菜单选项
当执行完选项2的数组元素输入逻辑后,没有重新读取用户的菜单选择,while(true)循环会反复进入option == 2的分支,不断执行输入数组元素的for循环,造成无限要求输入的假象。
3. 缺少非法输入的边界处理
如果用户输入的数组大小为0或负数,for循环会直接跳过;如果输入非整数内容,nextInt()会抛出异常导致程序崩溃,这些情况都没有做处理。
修正后的代码
import java.util.Scanner; public class ArrayInputDemo { private static Scanner scanner = new Scanner(System.in); // 统一使用一个Scanner对象 public static void main(String[] args) { int setSize = 0; int[] integerValues = new int[0]; int option = 0; while (true) { mainMenu(); // 每次循环都显示菜单 option = scanner.nextInt(); if (option == 1) { System.out.println("Enter set size:"); // 处理非整数输入,避免异常 while (!scanner.hasNextInt()) { System.out.println("请输入有效的整数!"); scanner.next(); // 丢弃无效输入 } setSize = scanner.nextInt(); // 确保数组大小为正整数 if (setSize <= 0) { System.out.println("数组大小必须大于0!"); continue; } integerValues = new int[setSize]; System.out.println("数组大小已设置为" + setSize); } else if (option == 2) { if (setSize <= 0) { System.out.println("请先通过选项1设置数组大小!"); continue; } for (int i = 0; i < setSize; i++) { System.out.println("请输入第" + (i + 1) + "个整数元素:"); // 处理非整数输入 while (!scanner.hasNextInt()) { System.out.println("请输入有效的整数!"); scanner.next(); } integerValues[i] = scanner.nextInt(); } System.out.println("数组元素输入完成!"); } else if (option == 3) { // 增加退出选项,避免死循环 System.out.println("程序退出"); scanner.close(); break; } else { System.out.println("无效选项,请重新选择!"); } } } private static void mainMenu() { System.out.println("===== 主菜单 ====="); System.out.println("1. 设置数组大小"); System.out.println("2. 输入数组元素"); System.out.println("3. 退出程序"); System.out.println("请选择操作选项:"); } }
关键修复点说明
- 统一使用单个Scanner对象,避免输入处理混乱;
- 每次循环开始先显示菜单并读取新的选项,确保执行完选项2后能回到菜单选择;
- 增加输入合法性校验:检查数组大小是否为正整数,拦截非整数输入;
- 增加退出选项,避免程序永远无法终止。
内容的提问来源于stack exchange,提问作者Brianna
相关产品推荐
相关产品推荐

