设置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在被使用前完成实例化:
- 在
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() }
- 保持
fetchData里的回调逻辑不变,当异步请求拿到数据后,调用mAdapter.updateNews(newsArray)就能正常更新列表了——这时候mAdapter已经完成初始化,不会再抛出异常。
额外小提示
- 使用
lateinit时,一定要确保所有可能访问该变量的路径,都在访问前完成初始化; - 如果你不确定变量是否已初始化,可以用
::mAdapter.isInitialized做检查,但在这个场景下,调整初始化顺序就能彻底规避问题。
内容的提问来源于stack exchange,提问作者Adrishyantee Maiti
相关产品推荐
相关产品推荐

