阅读 477

Kotlin知识拾遗之--->Kotlin中的可空类型

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修改,是不可以的。

文章分类
Android
文章标签