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

如何解决Kotlin lateinit变量未初始化异常并获取cartDocs的id

解决kotlin.UninitializedPropertyAccessException异常问题

问题根源

你遇到的这个异常,核心原因是lateinit修饰的cart变量在调用cart.id时还没有被初始化。看你的代码,在onResponse里你把response.body()?.docs!!传给了showdata方法,但完全没有给cart变量赋值——这就导致你后面调用cart.id时,cart还是一个未初始化的空引用,自然抛出异常。就算你去掉data class里的可空符号,只要没给cart赋值,这个问题依然存在。

修复步骤

  1. 先给cart变量赋值
    在onResponse方法里,拿到有效的cartDocs对象后,第一时间把它赋值给cart,确保后续使用前变量已经初始化:
override fun onResponse(call: Call<CartResponse>, response: Response<CartResponse>) {
    swipeRefreshLo.setOnRefreshListener(this@CartViewActivity)
    // 先处理空安全,避免直接用!!导致空指针
    response.body()?.docs?.let { cartDocs ->
        // 给lateinit变量赋值
        this.cart = cartDocs
        showdata(cartDocs)
        // 现在可以安全访问cart.id了
        val itemId = cart.id
        itemId?.let {
            SharedPreference.setCartId(applicationContext, it)
        }
    } ?: run {
        // 处理docs为空的情况,比如提示用户加载失败
    }
}
  1. 优化空安全处理(可选但推荐)
    你原来代码里用response.body()?.docs!!强制非空,这很容易在接口返回为空时抛出NullPointerException,上面的代码用let和?: run做了空安全处理,更健壮。

  2. 关于data class的可空符号
    如果你的接口返回的id字段是必传的,那可以把cartDocs里的id改成非空:

data class cartDocs(
    var id:String, // 去掉可空符号
    var title:String?=null,
    // 其他字段保持不变...
)

但这前提是后端保证id一定存在,否则会在Gson/Retrofit解析时抛出解析异常。

额外提醒

lateinit修饰符的使用场景是你能保证变量在第一次使用前一定被初始化,如果不确定的话,更推荐用var cart: cartDocs? = null,然后使用时做空判断,这样更安全。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 09:47:30