getParcelableExtra返回NullPointerException问题求助
解决Parcelable对象传递时readList空指针异常问题
嘿,我之前也踩过完全一样的坑!明明传递前Movies对象的数据都正常,结果到DetailActivity反序列化的时候在readList这里爆空指针,大概率是Parcelable实现的细节没处理到位,或者接收数据的姿势不对。下面是几个最常见的排查点和解决方法:
1. 重点检查Movies类的Parcelable实现,处理List字段的null情况
空指针基本都是在反序列化List的时候触发的——如果原对象里的List是null,直接调用in.readList()就会炸。得给List做个兜底初始化:
错误写法(直接readList,null就报错):
private List<String> genreList; protected Movies(Parcel in) { // 原List为null时,这里直接readList会抛出空指针 in.readList(genreList, getClass().getClassLoader()); }
正确写法:
方法一:先初始化空List再读取
private List<String> genreList; protected Movies(Parcel in) { // 先new一个空ArrayList,再读数据进去,避免null genreList = new ArrayList<>(); in.readList(genreList, getClass().getClassLoader()); }
方法二:用createTypedArrayList(更推荐,API 23+可用)
如果你的List里存的是另一个Parcelable对象(比如List<Genre>),用这个方法会自动处理null,直接返回空List而不是null:
private List<Genre> genreList; protected Movies(Parcel in) { genreList = in.createTypedArrayList(Genre.CREATOR); }
2. 确认传递和接收的Intent Extra Key完全一致
这个看起来简单,但很容易写错大小写或者拼写!传递时用的key和接收时必须丝毫不差:
MainActivity里的传递代码(示例):
Intent intent = new Intent(MainActivity.this, DetailActivity.class); intent.putExtra("KEY_SELECTED_MOVIE", movie); // 这里的key是"KEY_SELECTED_MOVIE" startActivity(intent);
DetailActivity里接收时必须用同一个key:
Movies movie = getIntent().getParcelableExtra("KEY_SELECTED_MOVIE");
3. 别在onCreate之前读取Intent数据
很多人会犯的错:在成员变量里直接初始化读取Intent,这时候Activity还没完全初始化,getIntent()可能返回null,自然就空指针了。一定要在onCreate方法里读取:
错误写法:
public class DetailActivity extends AppCompatActivity { // 这里初始化时,Activity还没创建,getIntent()可能是null Movies movie = getIntent().getParcelableExtra("KEY_SELECTED_MOVIE"); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // ... } }
正确写法:
public class DetailActivity extends AppCompatActivity { private Movies movie; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_detail); // 先判断Intent不为null,再读取 if (getIntent() != null) { movie = getIntent().getParcelableExtra("KEY_SELECTED_MOVIE"); if (movie != null) { // 这里放心处理movie的数据就好 } } } }
4. 检查Movies类的CREATOR实现是否正确
Parcelable的CREATOR必须完整实现createFromParcel和newArray,不能漏写任何字段的反序列化逻辑:
public static final Parcelable.Creator<Movies> CREATOR = new Parcelable.Creator<Movies>() { @Override public Movies createFromParcel(Parcel in) { return new Movies(in); } @Override public Movies[] newArray(int size) { return new Movies[size]; } };
按照这几个方向排查,应该就能解决你的空指针问题啦!
内容的提问来源于stack exchange,提问作者sbj1811
相关产品推荐
相关产品推荐

