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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 18:31:04