You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Android Studio虚拟方法调用错误:启动DiaryActivity触发空指针异常

解决ListView调用setAdapter时的NullPointerException问题

从你给出的崩溃日志来看,问题的核心非常清晰:

FATAL EXCEPTION: main
java.lang.NullPointerException: 尝试对空对象引用调用虚拟方法'void android.widget.ListView.setAdapter(android.widget.ListAdapter)'

简单说就是你要给ListView设置适配器的时候,这个ListView对象根本没找到,是个空引用。下面是一步步的排查和解决方法:

1. 先确认布局文件里的ListView存在且ID正确

打开DiaryActivity对应的布局文件(比如activity_diary.xml),检查:

  • 里面确实有<ListView>这个控件
  • 控件的android:id属性是正确的,比如android:id="@+id/listView_diary",别写错拼写或者大小写

2. 检查Activity中初始化代码的顺序

这是最容易踩的坑!在DiaryActivityonCreate()方法里,必须先加载布局,再去获取ListView实例,顺序绝对不能反:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // 第一步:先加载布局文件,这一步不能少,也不能放在后面
    setContentView(R.layout.activity_diary);
    // 第二步:根据ID找到ListView
    ListView myListView = findViewById(R.id.listView_diary);
    // 第三步:再给ListView设置适配器
    myListView.setAdapter(yourCustomAdapter);
}

如果在setContentView()之前就调用findViewById(),布局还没加载到内存里,肯定返回null,调用setAdapter()就会崩溃。

3. 排查其他常见错误

  • 有没有把ListView的ID写错?比如代码里写的是R.id.list_view,但布局里是R.id.listView,大小写或者单词拼写不一致都会导致找不到控件
  • 如果你的ListView是在Fragment的布局里,那不能在Activity里调用findViewById(),得在Fragment的onViewCreated()方法里去获取控件实例
  • 有没有不小心用了其他控件的ID?比如把RecyclerView的ID当成了ListView的ID去查找

额外调试小技巧

怕下次再踩坑的话,可以在设置适配器前加个空判断,既能避免崩溃,还能打日志提示问题:

if (myListView != null) {
    myListView.setAdapter(yourCustomAdapter);
} else {
    Log.e("DiaryActivity", "警告:ListView实例为空,请检查布局和ID是否正确!");
}

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

火山引擎 最新活动