You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何无法退出循环?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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 23:05:20