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
相关产品推荐
相关产品推荐

