HashMap场景下登录验证cardData为null问题求助
问题分析与修复方案
核心问题:Database实例不共享
你在AddUser类中新建了一个Database实例并添加数据,但验证PIN的类里的database成员变量要么未初始化(触发Database is null错误),要么指向了另一个空实例——两个完全独立的实例导致数据无法共享,所以查询时找不到对应卡号的信息,返回null。
具体修复步骤
1. 保证使用同一个Database实例
方案一:实例传递(低耦合推荐)
修改验证类的构造逻辑,传入已填充数据的Database实例:
// 验证类的构造方法 public PinValidator(Database database) { this.database = database; } // 在AddUser中创建并传递实例 Database data = new Database(); data.addCardInfo(nmField.getText(), atmField.getText(), pinField.getText(), balField.getText()); // 初始化验证类时传入同一个实例 PinValidator validator = new PinValidator(data);
方案二:单例模式(全局唯一实例)
修改Database类为单例,确保所有代码使用同一个实例:
public class Database { private static final Database INSTANCE = new Database(); private Map<String, String[]> cardPinMap = new HashMap<>(); // 私有构造,禁止外部新建实例 private Database() {} // 全局获取实例的方法 public static Database getInstance() { return INSTANCE; } public void addCardInfo(String name, String cardNumber, String pin, String bal) { cardPinMap.put(cardNumber, new String[] { pin, name, bal }); } public String getPinByCardNumber(String cardNumber) { String[] cardData = cardPinMap.get(cardNumber); return cardData != null ? cardData[0] : null; } }
之后在所有需要使用Database的地方统一获取单例:
// AddUser中添加数据 Database data = Database.getInstance(); data.addCardInfo(nmField.getText(), atmField.getText(), pinField.getText(), balField.getText()); // 验证类中获取实例 private Database database = Database.getInstance();
2. 修复checkPin方法的空指针风险
当卡号不存在时getPinByCardNumber会返回null,直接调用equals会抛出空指针异常,必须先判空:
public boolean checkPin(String cardNumber, String enteredPin) { String actualPin = database.getPinByCardNumber(cardNumber); // 先确认actualPin不为null,再做比较;同时兼容enteredPin为空的场景 return actualPin != null && actualPin.equals(enteredPin); }
额外排查点
- 确认添加数据时
atmField.getText()的卡号,和验证时输入的卡号完全一致(注意空格、数字格式,避免前后有不可见字符) - 检查
addCardInfo的参数顺序是否正确:方法定义是(name, cardNumber, pin, bal),确认传入的参数没有顺序颠倒
内容的提问来源于stack exchange,提问作者farisalisic
相关产品推荐
相关产品推荐

