1、声明一个不为空的变量
// 1、声明一个不为空的变量,不可被赋值为null,且必须在后面初始化 by xiaojin on 7/24/21 9:32 PM
var name:String
init {
name = "Tom"
// 此时会被提示 Null can not be a value of a non-null type String by xiaojin on 7/24/21 9:33 PM
name = null
}
声明一个非空变量时,如果在定义时未初始化,则必须在后面初始化,且不能被赋值为null
2、声明一个可为空变量
// 2、声明一个可为空的变量 by xiaojin on 7/24/21 9:38 PM
var tel:String?
init {
// 可被赋值为null by xiaojin on 7/24/21 9:40 PM
tel = null
// 因为call方法需要的是String类型,但是tel其实是String?类型,所以需要用!!进行非空断言by xiaojin on 7/24/21 9:42 PM
call(tel!!)
}
fun call(num:String){
println("对 ${num} 拨号中.....")
}
一旦我们这么做了,会导致程序崩溃,即对一个值为null的变量使用了非空断言时会抛出异常
Exception in thread "main" kotlin.KotlinNullPointerException
at com.example.firstkotlin.koltin.NullType.<init>(NullType.kt:30)
at com.example.firstkotlin.koltin.NullTypeKt.main(NullType.kt:45)
at com.example.firstkotlin.koltin.NullTypeKt.main(NullType.kt)
所以我们通常建议使用下面的方法
// 2、声明一个可为空的变量 by xiaojin on 7/24/21 9:38 PM
var tel:String?
init {
// 即可被赋值为null by xiaojin on 7/24/21 9:40 PM
tel = null
// 也可被赋值为具体的String值 by xiaojin on 7/24/21 9:40 PM
// tel = "1234567890"
// 我们通常不建议使用非空断言,因为它非常危险,一旦变量为null,则会抛出异常 by xiaojin on 7/24/21 9:44 PM
call(tel ?: "0")
}
fun call(num:String){
println("对 ${num} 拨号中.....")
}
此时输出位:
对 0 拨号中.....
在此示例中,安全调用操作符(?:) 会检查其左边的值,如果他不为空,会返回他,如果为空,则会执行后面的操作。
3、当可空类型遇见val一起使用
// 3、当可空类型和val一起使用 by xiaojin on 7/24/21 9:56 PM
val address:String?
init {
address = null
if(address != null){
// 请注意此处的入参,goHome需要的参数是String类型而不是String?,说明在通过非空判断后,String?类型自动转变为了String类型 by xiaojin on 7/24/21 10:05 PM
goHome(address)
}
}
fun goHome(destination:String){
println("导航到 ${destination}")
}
这是一件很有意思的事情,被val修饰的可空类型,在经过非空判断后,去掉了可空属性,这和val的特性有关,因为val一旦被赋值,就不可被修改。当然如果使用的是var修改,是不可以的。