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

设置RecyclerView Adapter时触发kotlin.UninitializedPropertyAccessException异常:lateinit属性mAdapter未初始化

解决kotlin.UninitializedPropertyAccessException:lateinit属性mAdapter未初始化的问题

这个问题是Kotlin开发Android时很常见的坑,咱们拆解下问题原因和修复方案:

问题根源

你用lateinit声明了mAdapter,但在onCreate里直接执行recyclerView.adapter = mAdapter时,这个变量根本没被实例化。Kotlin的lateinit规则很明确:必须在第一次访问变量前完成初始化,否则就会抛出这个异常。

另外你的fetchData是异步网络请求,它的回调会在onCreate执行完之后才触发——这意味着等你拿到数据想调用mAdapter.updateNews的时候,程序早就因为之前访问未初始化的mAdapter崩溃了。

修复步骤

只需要调整初始化顺序,确保mAdapter在被使用前完成实例化:

  1. 在onCreate中,设置完recyclerView.layoutManager之后,先实例化mAdapter,再赋值给recyclerView的adapter:
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    recyclerView = findViewById(R.id.recyclerView)
    
    // 先配置布局管理器
    val verticalLayoutManager = LinearLayoutManager(this)
    recyclerView.layoutManager = verticalLayoutManager
    
    // 实例化mAdapter(传入实现了NewsItemClicked的当前Activity)
    mAdapter = NewsListAdapter(this)
    // 给RecyclerView设置adapter
    recyclerView.adapter = mAdapter
    
    // 最后发起网络请求
    fetchData()
}
  1. 保持fetchData里的回调逻辑不变,当异步请求拿到数据后,调用mAdapter.updateNews(newsArray)就能正常更新列表了——这时候mAdapter已经完成初始化,不会再抛出异常。

额外小提示

  • 使用lateinit时,一定要确保所有可能访问该变量的路径,都在访问前完成初始化;
  • 如果你不确定变量是否已初始化,可以用::mAdapter.isInitialized做检查,但在这个场景下,调整初始化顺序就能彻底规避问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 05:09:12