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

Android应用启动崩溃:DetailActivity空指针异常排查求助

问题分析

从Logcat报错信息可以明确,崩溃根源是selectedEtkinlikler对象为null,你尝试直接访问它的name字段时触发了NullPointerException。


解决方法

方法1:修复单例(Singleton)的使用逻辑

如果坚持用单例传递数据,必须确保单例中已正确存入选中的对象:

  1. 完善Singleton类:确保它包含设置选中对象的方法
public class Singleton {
    private static Singleton instance;
    private Etkinlikler selectedEtkinlikler;

    private Singleton() {}

    public static Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }

    public Etkinlikler getSelectedEtkinlikler() {
        return selectedEtkinlikler;
    }

    public void setSelectedEtkinlikler(Etkinlikler selectedEtkinlikler) {
        this.selectedEtkinlikler = selectedEtkinlikler;
    }
}
  1. 跳转前存入对象:在启动DetailActivity的代码中,先把选中的Etkinlikler对象存入单例
// 示例:列表项点击事件中
Etkinlikler clickedEtkinlik = ...; // 获取当前点击的Etkinlikler对象
Singleton.getInstance().setSelectedEtkinlikler(clickedEtkinlik);

Intent intent = new Intent(当前Activity.this, DetailActivity.class);
startActivity(intent);
  1. 增加空判断:在DetailActivity的onCreate中添加空值校验,避免崩溃
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    binding = ActivityDetailBinding.inflate(getLayoutInflater());
    View view = binding.getRoot();
    setContentView(view);

    Singleton singleton = Singleton.getInstance();
    Etkinlikler selectedEtkinlikler = singleton.getSelectedEtkinlikler();

    if (selectedEtkinlikler != null) {
        binding.etkinliklerNameText.setText(selectedEtkinlikler.name);
        binding.countryNameText.setText(selectedEtkinlikler.country);
        binding.imageView.setImageResource(selectedEtkinlikler.image);
    } else {
        // 对象为空时的处理,比如直接返回上一页
        finish();
    }
}

方法2:恢复使用Intent传递Serializable对象(更推荐)

单例容易因为生命周期或初始化问题导致对象为空,用Intent传递数据更可靠:

  1. 跳转时传递对象:在启动DetailActivity的代码中,把选中的对象放入Intent
Etkinlikler clickedEtkinlik = ...; // 获取当前点击的Etkinlikler对象
Intent intent = new Intent(当前Activity.this, DetailActivity.class);
intent.putExtra("SELECTED_ETKINLIK", clickedEtkinlik);
startActivity(intent);
  1. 接收并校验对象:在DetailActivity中取出对象并添加空判断
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    binding = ActivityDetailBinding.inflate(getLayoutInflater());
    View view = binding.getRoot();
    setContentView(view);

    Etkinlikler selectedEtkinlikler = (Etkinlikler) getIntent().getSerializableExtra("SELECTED_ETKINLIK");

    if (selectedEtkinlikler != null) {
        binding.etkinliklerNameText.setText(selectedEtkinlikler.name);
        binding.countryNameText.setText(selectedEtkinlikler.country);
        binding.imageView.setImageResource(selectedEtkinlikler.image);
    } else {
        finish();
    }
}

额外优化:给Etkinlikler类添加Getter方法

直接访问成员字段不符合封装规范,添加Getter可以避免字段为空时的潜在问题:

import java.io.Serializable;

public class Etkinlikler implements Serializable {
    private String name;
    private String country;
    private int image;

    public Etkinlikler(String name, String country, int image) {
        this.name = name;
        this.country = country;
        this.image = image;
    }

    public String getName() {
        return name != null ? name : "";
    }

    public String getCountry() {
        return country != null ? country : "";
    }

    public int getImage() {
        return image;
    }
}

调用时改用Getter:

binding.etkinliklerNameText.setText(selectedEtkinlikler.getName());
binding.countryNameText.setText(selectedEtkinlikler.getCountry());

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 04:22:18