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

Java银行系统模拟器:跨类访问Map失败问题排查

问题分析与解决

问题根源

你在Login类里新建了一个Signup对象getDetails,这个对象和你实际用来执行注册操作的Signup实例是完全独立的两个对象。也就是说,用户注册时数据存在了A对象的account里,但Login去拿的是B对象的空account,自然循环没输出内容。

修复方案

方式1:传递已有Signup实例给Login(推荐)

不要在Login里新建Signup,而是把已经完成注册的Signup对象传给Login,确保两者操作的是同一个数据集合。

修改Login类:

public class Login {
    Scanner scanner = new Scanner(System.in);
    Signup signupInstance;
    public Map<String,String> account = new HashMap<>();

    // 通过构造方法接收外部的Signup实例
    public Login(Signup signupInstance) {
        this.signupInstance = signupInstance;
    }

    public void login() {
        account = signupInstance.getAccount();
        for (String username : account.keySet()) {
            System.out.println(username);
        }
        System.out.println("Enter username (Login)");
        String inputUser = scanner.next();
        if (account.containsKey(inputUser)) {
            System.out.println("Enter password");
            String inputPwd = scanner.next();
            // 新增密码验证逻辑
            if (account.get(inputUser).equals(inputPwd)) {
                System.out.println("Login successful.");
            } else {
                System.out.println("Wrong password.");
            }
        } else {
            System.out.println("This account isn't registered.");
        }
    }
}

然后在主类中协调两个类的实例:

public class BankSimulator {
    public static void main(String[] args) {
        Signup signup = new Signup();
        signup.signup(); // 先执行注册流程

        Login login = new Login(signup); // 将注册过的Signup实例传入Login
        login.login();
    }
}

方式2:使用静态共享Map(仅适合快速测试)

如果只是做简单测试,可以把Signup里的account改成静态变量,让所有Signup实例共享同一个Map:

public class Signup {
    Scanner scanner = new Scanner(System.in);
    public static Map<String,String> account = new HashMap<>(); // 添加static修饰符
    String input_username;
    String input_password;

    public Map<String,String> getAccount() {
        for (String username : account.keySet()) {
            System.out.println(username);
        }
        return account;
    }

    public void signup() {
        System.out.println("Enter username: (Signup)");
        input_username = scanner.next();
        // 新增用户名唯一性校验
        if (account.containsKey(input_username)) {
            System.out.println("Username already exists.");
            return;
        }
        System.out.println("Enter password:");
        input_password = scanner.next();
        System.out.println("Signup successful.");
        account.put(input_username,input_password);
    }
}

注意:这种方式在实际项目中容易引发线程安全问题,不推荐用于真实业务系统。

额外优化建议

  • 注册阶段添加用户名唯一性校验,避免重复注册
  • 登录阶段补充密码匹配验证逻辑
  • 可以将Scanner实例统一放在主类中,避免多个类重复创建

内容的提问来源于stack exchange,提问作者Bradley Wang

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 03:10:27