Android应用传递Parcelable数据时出现NullPointerException问题求助
错误java.lang.NullPointerException: Attempt to invoke virtual method 'android.os.Parcelable android.os.Bundle.getParcelable(java.lang.String)' on a null object reference,核心原因是getIntent().getExtras()返回了null——也就是启动BlogActivity时,Intent根本没携带任何额外数据(Bundle)。
1. 检查启动BlogActivity的代码(MainActivity/MainAdapter中)
确保启动时正确把Parcelable对象放进Intent的Extras里,而且key要和BlogActivity里的EXTRAS_BLOG完全一致(大小写、拼写半分不能错)。
正确示例:
// 比如在MainAdapter的点击事件里 Blog blog = mList.get(position); Intent intent = new Intent(context, BlogActivity.class); // 直接把Parcelable对象放进Intent intent.putExtra(BlogActivity.EXTRAS_BLOG, blog); context.startActivity(intent);
或者用Bundle包装的写法:
Bundle bundle = new Bundle(); bundle.putParcelable(BlogActivity.EXTRAS_BLOG, blog); intent.putExtras(bundle); context.startActivity(intent);
关键提醒:EXTRAS_BLOG的字符串值必须在两个类中完全统一,比如都定义成public static final String EXTRAS_BLOG = "extra_blog";
2. 验证Blog类的Parcelable实现是否正确
如果Parcelable写得有问题,会导致对象传递失败,间接让Extras为空。确保Blog类的实现符合规范:
public class Blog implements Parcelable { private String title; private String content; public Blog(String title, String content) { this.title = title; this.content = content; } // 从Parcel读取数据的构造函数,必须有 protected Blog(Parcel in) { title = in.readString(); content = in.readString(); } // Parcelable必备的Creator public static final Creator<Blog> CREATOR = new Creator<Blog>() { @Override public Blog createFromParcel(Parcel in) { return new Blog(in); } @Override public Blog[] newArray(int size) { return new Blog[size]; } }; @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel dest, int flags) { dest.writeString(title); dest.writeString(content); } // 别忘了写getter方法,方便后续取数据 public String getTitle() { return title; } public String getContent() { return content; } }
重点:writeToParcel写入数据的顺序,必须和Parcel构造函数里读取的顺序完全一致,不然会解析出错甚至传递失败。
3. 给BlogActivity加空判断,避免崩溃
就算前面都没问题,加个空判断能防崩溃还方便调试:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_blog); Intent intent = getIntent(); if (intent != null) { Bundle extras = intent.getExtras(); if (extras != null) { Blog blog = extras.getParcelable(EXTRAS_BLOG); if (blog != null) { showData(blog); } else { Toast.makeText(this, "数据加载失败", Toast.LENGTH_SHORT).show(); } } else { Toast.makeText(this, "未获取到数据", Toast.LENGTH_SHORT).show(); } } }
4. 检查其他启动路径
如果App里还有别的地方会启动BlogActivity(比如通知、快捷方式),也要确保这些路径的Intent同样携带了正确的Extras,不然照样会触发空指针。
内容的提问来源于stack exchange,提问作者Abd

