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

在类A方法中从类B向ArrayList添加元素时提示为空如何解决

问题根因分析

  1. 实例不共享:你当前在DailyMgr中每次调用都通过new MonthlyMgr()创建了全新的MonthlyMgr实例,每个实例的monthlyList都是独立的新数组,你之前存在其他实例里的数据和新实例完全无关,自然读取时会拿到空数组。
  2. 索引插入逻辑错误:你用了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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 08:15:01