Kotlin报错:变量'mAdapter'必须初始化,如何用?或!!消除该警告?
解决Kotlin中Variable 'mAdapter' must be initialized错误(用?/!!操作符)
嘿,这个问题我太熟了!本质上是因为你在初始化mAdapter的lambda回调里直接引用了它自己——这时候Kotlin的空安全检查会跳出来说:“这变量还没完全初始化呢,你怎么就调用它的方法了?” 下面给你两种用?或者!!操作符解决的方案,各有优劣,你可以根据场景选:
方案一:用!!强制非空(推荐,保证后续使用无空值)
把val改成var,先声明为可空类型并初始化为null,然后在init块里完成赋值,同时在lambda里用!!告诉编译器“我保证这里它肯定非空”:
private var mAdapter: BaseAdapter? = null init { mAdapter = createAdapter(R.id.adapter) { listPosition: Int -> // 用!!强制非空,因为初始化完成后mAdapter肯定有值 mAdapter!!.notifyItemChanged(listPosition) } }
注意:这个方案的前提是lambda不会在init块执行完成前被调用(比如createAdapter内部不会立刻触发这个回调),否则会抛出NullPointerException。但一般RecyclerView Adapter的回调都是在数据更新时触发,这时候初始化早就完成了,所以很安全。
方案二:用?.安全调用(更谨慎,但后续需处理空值)
直接把mAdapter声明为可空类型,在lambda里用安全调用操作符?.,这样即使mAdapter为空(理论上不会发生),也不会崩溃:
private val mAdapter: BaseAdapter? = createAdapter(R.id.adapter) { listPosition: Int -> // 用?.安全调用,为空时什么都不做 mAdapter?.notifyItemChanged(listPosition) }
这个方案的缺点是,后续你在其他地方使用mAdapter时,都要处理它可能为空的情况(比如每次都要写mAdapter?.doSomething()或者用!!),有点麻烦。
额外小提示
其实还有更优雅的方式(比如用by lazy委托),但既然你明确要求用?或!!操作符,上面两个方案就完全能解决问题啦~
内容的提问来源于stack exchange,提问作者王 能
相关产品推荐
相关产品推荐

