Java使用switch case处理用户输入时出现无限循环问题排查
问题原因分析
- 核心问题是输入读取和字符串拆分的逻辑放在了死循环外部:代码仅在启动时读取1次用户输入、拆分得到
part数组,后续死循环运行时永远使用第一次获取的part[0]做switch判断,除了输入EXIT会直接退出程序,其余case的break仅能跳出switch分支,无法终止外层的do-while(true)死循环,因此会反复执行对应case的逻辑。 - 额外潜在风险:如果用户第一次输入的内容按空白拆分后长度不足2,执行
AB分支的part[1]会直接触发数组下标越界异常。
修复后的代码示例
public static void main(String[] args) { Scanner sc = new Scanner(System.in); do { // 读取输入、拆分逻辑移到循环内部,每次循环都读取新的用户输入 String str = sc.nextLine(); String[] part = str.split("\\s+"); // 空输入校验,避免数组下标越界 if (part.length == 0) { System.out.println("输入不能为空,请重新输入"); continue; } switch(part[0]) { case "AB": // 参数合法性校验,避免AB命令后未带数字的异常 if (part.length < 2) { System.out.println("AB命令后需携带数字参数"); break; } System.out.println("hi"); int data = Integer.parseInt(part[1]); System.out.println(data); break; case "PR": System.out.println("printining"); break; case "AE": System.out.println("AE"); break; case "EXIT": System.out.println("程序退出"); sc.close(); System.exit(0); break; default: System.out.println("未识别的命令,请重新输入"); break; } } while(true); }
修复说明
- 每次循环都重新读取用户输入并拆分,保证switch判断的是最新输入的命令
- 新增空输入、命令参数缺失的校验逻辑,避免运行时异常
- 新增未识别命令的default分支,提升代码健壮性
- 新增Scanner资源关闭逻辑,避免资源泄漏
内容的提问来源于stack exchange,提问作者Ninja
相关产品推荐
相关产品推荐

