为何无法退出循环?ATM登录Java代码故障排查求助
问题分析与解决
1. 无法退出循环的核心原因
你的代码存在两个关键问题,导致正确输入账号和PIN后仍无法退出循环:
- 循环终止条件未触发:当验证通过并调用
getAccountType()后,没有修改x的值,while(x == 1)的循环条件始终成立,会继续执行后续代码并进入下一轮循环。 - 错误提示强制输出:无论验证是否成功,循环体内的
System.out.println("\nWrong Account or Pin Number \n")都会执行,不仅会误导你以为验证失败,还会让循环持续运行。
2. 修复后的代码示例
public void getLogin() throws IOException { // 将data初始化移至循环外,避免重复执行无意义的插入操作 data.put(961668, 2255); data.put(961768, 2253); data.put(961568, 2353); int x = 1; do { try { System.out.println("----------Welcome to the ATM Machine Project----------"); System.out.println("Enter your Account number: "); setAccountNumber(menuOutput.nextInt()); System.out.println("Enter your correct PIN number: "); setPinNumber(menuOutput.nextInt()); boolean isAuthenticated = false; // 找到匹配项后立即终止遍历并设置循环终止条件 for (Entry<Integer, Integer> entry : data.entrySet()) { if (entry.getKey().equals(getAccountNumber()) && entry.getValue().equals(getPinNumber())) { getAccountType(); isAuthenticated = true; x = 2; // 标记循环终止 break; // 跳出遍历循环,无需继续检查其他账号 } } // 仅在验证失败时输出错误提示 if (!isAuthenticated) { System.out.println("\nWrong Account or Pin Number \n"); } } catch (Exception e) { System.out.println("\nYou have Enter Incorrect value !! you have to enter only numbers: \n"); x = 2; // 清空输入缓冲区,避免nextInt()持续读取错误输入导致死循环 menuOutput.nextLine(); } } while (x == 1); }
3. 性能与实现方式的优化建议
- 用HashMap直接查找替代遍历:当前遍历整个
entrySet的时间复杂度是O(n),直接通过data.get(accountNumber)获取对应PIN,时间复杂度为O(1),效率更高。示例代码:
Integer storedPin = data.get(getAccountNumber()); if (storedPin != null && storedPin.equals(getPinNumber())) { getAccountType(); x = 2; } else { System.out.println("\nWrong Account or Pin Number \n"); }
- 精准捕获异常:不要直接捕获所有
Exception,建议捕获InputMismatchException,避免掩盖其他未知错误。 - 避免循环内重复初始化:原代码每次循环都执行
data.put(),虽然HashMap会覆盖重复键,但属于无意义的性能浪费,将初始化移到循环外即可。
内容的提问来源于stack exchange,提问作者Mohd Zeeshan
相关产品推荐
相关产品推荐

