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

Parcelable模型ArrayList跨Activity传递后调用子列表size报空指针异常

解决Parcelable传递后List字段空指针异常的问题

你的NullPointerException根源很明确:Parcelable实现时完全遗漏了dir字段的序列化与反序列化操作。不管是外层的BVCCategoryTemplateModel还是内部类DirCategory,在writeToParcel方法和Parcel构造方法中,都只处理了url和name两个字段,导致通过Intent传递后,getDir()返回null,调用size()时触发空指针。

以下是具体修复步骤:

1. 修复BVCCategoryTemplateModel的Parcelable实现

补充dir字段的读写逻辑:

public class BVCCategoryTemplateModel implements Parcelable {
    // 原有字段保持不变

    protected BVCCategoryTemplateModel(Parcel in) {
        url = in.readString();
        name = in.readString();
        // 读取dir列表,传入对应类型的CREATOR
        dir = in.createTypedArrayList(DirCategory.CREATOR);
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(url);
        dest.writeString(name);
        // 写入dir列表
        dest.writeTypedList(dir);
    }

    // 原有方法保持不变
}

2. 修复DirCategory的Parcelable实现

同样补充它自身dir字段的读写逻辑,同时注意**DirCategoryData必须实现Parcelable接口**(否则无法序列化该列表):

@Keep
public static class DirCategory implements Parcelable{
    // 原有字段保持不变

    protected DirCategory(Parcel in) {
        url = in.readString();
        name = in.readString();
        // 读取DirCategoryData列表
        dir = in.createTypedArrayList(DirCategoryData.CREATOR);
    }

    @Override
    public void writeToParcel(Parcel parcel, int i) {
        parcel.writeString(url);
        parcel.writeString(name);
        // 写入DirCategoryData列表
        parcel.writeTypedList(dir);
    }

    // 原有方法保持不变
}

3. 实现DirCategoryData的Parcelable接口

如果DirCategoryData还未实现Parcelable,必须补充实现(示例根据常见字段编写,需匹配你的实际字段):

@Keep
public static class DirCategoryData implements Parcelable {
    // 替换为你的实际字段
    @Expose
    @SerializedName("field_name")
    private String fieldName;

    protected DirCategoryData(Parcel in) {
        fieldName = in.readString();
    }

    public static final Creator<DirCategoryData> CREATOR = new Creator<DirCategoryData>() {
        @Override
        public DirCategoryData createFromParcel(Parcel in) {
            return new DirCategoryData(in);
        }

        @Override
        public DirCategoryData[] newArray(int size) {
            return new DirCategoryData[size];
        }
    };

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(fieldName);
    }

    // 补充你的getter/setter方法
}

额外防御性建议

  • 在getDir()方法中返回空列表而非null,从根源避免空指针:
    public List<DirCategory> getDir() {
        return dir != null ? dir : Collections.emptyList();
    }
    
  • Activity B中获取数据时添加判空逻辑:
    ArrayList<BVCCategoryTemplateModel> templateSubcategoryDataList = getIntent().getParcelableArrayListExtra("category_data");
    if (templateSubcategoryDataList != null && !templateSubcategoryDataList.isEmpty()) {
        int dirSize = templateSubcategoryDataList.get(0).getDir().size();
        // 后续操作
    }
    

内容的提问来源于stack exchange,提问作者Mayur

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 15:05:21