android: ?和!!的区别
一,?和!!的区别
?.
和!!
主要区别在于它们对空指针的处理方式
?.
(安全调用操作符):当变量可能为null时,使用?.
可以安全地调用其方法或属性。
如果变量为null,则不执行调用,直接返回null
!!
(非空断言操作符):当变量可能为null时,使用!!
会强制执行调用,
如果变量为null,则会抛出空指针异常
两者的区别
问号?的使用:
在声明对象时,把它跟在类名后面,表示这个类允许为null;
在调用对象时,把它跟在对象后面,表示如果为null程序就会视而不见。
两个叹号!!的使用
加在变量名后,如果对象为null,那么系统一定会报异常
二,代码例子:
val button1: Button = findViewById(R.id.button1)
button1.setOnClickListener {
// 在这里处理点击事件
val list: ArrayList<String>? = null
Log.d("TAG", "----List Size is ${list?.size}")
}
val button2: Button = findViewById(R.id.button2)
button2.setOnClickListener {
// 在这里处理点击事件
val list: ArrayList<String>? = null
Log.d("TAG", "----List Size is ${list!!.size}")
}
val button3: Button = findViewById(R.id.button3)
button2.setOnClickListener {
// 在这里处理点击事件
val list: ArrayList<String>? = null
Log.d("TAG", "----List Size is ${list.size}")
}
button1点击后:输出: ----List Size is null
button2点击后:抛出异常
button3这个写法是不能运行的,提示需要处理可为空的接收者(nullable receiver),
因为list值为null,所以要给list变量加上!!或?