讨论如下几个问题:
1、如何定义一个可以为空的对象,如何定一个一个不为空的对象
2、? !! 等操作符的区别
3、条件中检测null
4、如何安全调用
5、安全的类型检查
?与!!
1、在kotlin中"?"操作符允许对象为空,当为空时,返回null。
2、!!非空断言运算符则不允许对象为空,否则会抛出空指针异常、
3、通过"?"来做安全调用,如果对象为空,结果也为null
/**
* Person.kt
*
*/
public Class Person() {
var age:Int
// 延时初始化,默认非空
lateinit var name:String
// 默认非空
var fatherName:String = "Jack"
// nickName可以为空
var nickName:String? = null
/**
* !!与?的区别:
* 当对象为空时,!!操作符显式调用NULLPOINTEXCEPTION,
* 当对象为空时, ?操作符会返回null给赋值对象
* 如下例:
*/
public fun test() {
// 如果nickName为空,就抛出NulllPointerException异常
val nameLength0 = nickName!!.length
// 如果nickName为空, nameLength2也为空
var nameLength2:Int = nickName?.length
// 如果nickName为空,这样写代码,编译器会报错
var nameLength3:Int = nickName.length // 不安全的调用
// 不需要安全调用
var fatherNameLength = fatherName.length
}
检测null
public Class NullTest() {
var name:String? = null
public fun checkNull() {
// 显示安全检查name
val b:Int = if(b != null) b.length else -1
// 安全的调用 in this case , c is null
val c:Int = b?.length
}
!!非空断言操作符:不期而遇null崩溃
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
var nullTest = NullTest()
nullTest.nullTest() // 这里会崩溃 ......
}
}
安全的类型检查
class NullTest {
var a:Int = 0
public fun nullTest() {
// 如果a不是Int类型,aInt=null, 否则aInt=a
val aInt: Int? = a as? Int
}
}