如何解决Kotlin lateinit变量未初始化异常并获取cartDocs的id
解决kotlin.UninitializedPropertyAccessException异常问题
问题根源
你遇到的这个异常,核心原因是lateinit修饰的cart变量在调用cart.id时还没有被初始化。看你的代码,在onResponse里你把response.body()?.docs!!传给了showdata方法,但完全没有给cart变量赋值——这就导致你后面调用cart.id时,cart还是一个未初始化的空引用,自然抛出异常。就算你去掉data class里的可空符号,只要没给cart赋值,这个问题依然存在。
修复步骤
- 先给
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为空的情况,比如提示用户加载失败 } }
优化空安全处理(可选但推荐)
你原来代码里用response.body()?.docs!!强制非空,这很容易在接口返回为空时抛出NullPointerException,上面的代码用let和?: run做了空安全处理,更健壮。关于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
相关产品推荐
相关产品推荐

