在类A方法中从类B向ArrayList添加元素时提示为空如何解决
问题根因分析
- 实例不共享:你当前在
DailyMgr中每次调用都通过new MonthlyMgr()创建了全新的MonthlyMgr实例,每个实例的monthlyList都是独立的新数组,你之前存在其他实例里的数据和新实例完全无关,自然读取时会拿到空数组。 - 索引插入逻辑错误:你用了
ArrayList的按索引插入重载方法add(int index, E element),初始化时传入的12是数组容量不是实际元素个数,初始化完成后数组实际长度还是0,如果第一次插入的month-1大于0,会直接触发索引越界异常,你可能把这个报错误判成了数组为空。
解决方法
方案1:用单例模式保证全局共用同一个MonthlyMgr实例
如果整个应用生命周期里只需要一套月度数据,直接把MonthlyMgr改造成单例即可:
public class MonthlyMgr implements IRevenue { // 全局唯一实例 private static final MonthlyMgr INSTANCE = new MonthlyMgr(); public ArrayList<Monthly> monthlyList = new ArrayList<>(12); // 私有构造方法,禁止外部随意创建新实例 private MonthlyMgr() {} // 对外提供获取实例的唯一入口 public static MonthlyMgr getInstance() { return INSTANCE; } @Override public void addRevenue(int month, double earning) { // 先补全数组长度到对应月份,避免索引越界 while (monthlyList.size() < month) { monthlyList.add(null); } // 用set方法覆盖对应位置的值,避免add方法插入导致的索引位移问题 monthlyList.set(month-1, new Monthly(month, earning)); } }
DailyMgr中调用时不要再new新实例,直接拿全局单例:
IRevenue monthly = MonthlyMgr.getInstance(); monthly.addRevenue(month, monthRevenue);
方案2:手动传递实例保证读写统一
如果不需要全局单例,就确保你存数据、读数据用的是同一个MonthlyMgr实例:比如在首次创建MonthlyMgr实例的地方,通过构造方法或者set方法把实例传给DailyMgr,不要每次使用时都创建新实例。
内容的提问来源于stack exchange,提问作者newuserxyz
相关产品推荐
相关产品推荐

