读取事件时Location始终为null的票务系统问题求助
问题诊断与解决方案
嘿,我一眼就揪出问题的核心了——这完全是初始化顺序搞反导致的经典坑!
问题根源
看你TicketSystem里的readData()方法:
public void readData() { readEvents(); readLocations(); }
你先调用了readEvents()去创建Event对象,但Event的构造器里立刻就调用TicketSystem.getLocation(locationId)去获取位置。这时候locations这个HashMap还没被readLocations()填充啊!
你调试时看到locations里有数据,那是因为调试器是在所有初始化完成后查看的,但创建Event的那个瞬间,locations还是空的,自然拿不到对应的Location实例。
修复方案
把readData()里的调用顺序彻底反过来,先加载所有位置,再创建事件:
public void readData() { readLocations(); // 先把所有位置数据加载进locations HashMap readEvents(); // 再创建Event,此时getLocation就能正常拿到对应位置了 }
额外验证建议
你可以在Event构造器里加个临时调试代码确认一下:
public Event(...) { // ... 其他代码 System.out.println("创建Event时,是否存在该位置?" + TicketSystem.locations.containsKey(locationId)); setLocation(TicketSystem.getLocation(locationId)); }
运行后你会发现,原来的顺序下这个输出是false,调整顺序后就变成true了。
另外也可以快速检查下EventMapper里的data[5]是不是正确的locationId索引,避免因为索引错误拿到无效的ID,但核心问题肯定是初始化顺序的问题。
内容的提问来源于stack exchange,提问作者Cedric marx
相关产品推荐
相关产品推荐

