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
相关产品推荐
相关产品推荐

