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

Kotlin接入Firebase加载数据到RecyclerView出现lateinit未初始化错误如何解决

问题根因

你声明了延迟初始化属性private lateinit var reference : FirebaseDatabase1,但在getCodeDetails()方法中调用reference.getReference("CityCodes")之前,从未对该属性进行赋值操作,因此触发了kotlin.UninitializedPropertyAccessException未初始化访问异常。

修复步骤

  1. 先确认类名是否正确:官方Firebase Realtime Database SDK的核心类名为FirebaseDatabase,如果你不是自定义封装了名为FirebaseDatabase1的工具类,大概率是手误写错了类名,建议先修正。
  2. 在onCreate方法内调用getCodeDetails()之前,完成reference的初始化,示例代码如下:
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_bus_codes)

    // 新增初始化代码,使用官方默认实例直接用该写法即可
    reference = FirebaseDatabase.getInstance()
    // 若你是自定义的FirebaseDatabase1类,替换为对应构造方法初始化即可

    codeRecyclerView = findViewById(R.id.recyclerView)
    codeRecyclerView.layoutManager = LinearLayoutManager(this)
    codeRecyclerView.setHasFixedSize(true)
    codeArrayList = arrayListOf<CityCodes>()
    getCodeDetails()

    val Button = findViewById<Button>(R.id.button5)
    Button.setOnClickListener {
        startActivity(Intent(this@busCodesActivity, conductorMenu::class.java))}
}

其他优化建议

  • 避免使用!!强制空断言:如果服务端返回的数据结构和CityCodes字段不匹配,routeSnapshot.getValue会返回null,直接用!!会触发空指针崩溃,建议改为安全调用:
val code = routeSnapshot.getValue(CityCodes::class.java)
code?.let { codeArrayList.add(it) }
  • 不要保留TODO代码:onCancelled方法中的TODO默认会抛出异常,触发崩溃,建议替换为日志打印逻辑:
override fun onCancelled(error: DatabaseError) {
    Log.e("FirebaseLoad", "数据加载失败: ${error.message}")
}
  • 遵循命名规范:Android/Kotlin开发约定类名使用大驼峰格式,建议把busCodesActivity改为BusCodesActivity,conductorMenu改为ConductorMenu,降低后期维护成本。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 00:15:05