这是我参与「第四届青训营 」笔记创作活动的第7天
空安全,就是强制保证在运行过程中,避免出现NPE问题
如果允许让变量为Null,则容易导致常见的空指针异常NullPointerException,且这种异常,常发生在程序运行时,导致程序无法正常运行。所以,Kotlin提前在编译器就强迫我们重视起来,而不是等到运行时报错。
可空类型
-
Kotlin的变量,都默认
不能被赋值为null:var str: String = 'I am a string' // work,默认为不可空(non-null)类型 str = null // compilation error,编译报错,视图给不可空变量赋空值 -
为了允许出现
null,可以用?修饰变量:var str: String? = 'I am a string' str = null // work
安全调用操作符
-
当一个变量为可空类型时,则调用该变量的属性时,需要使用安全调用操作符:
常被用于链式调用中val a = "Kotlin" val b: String? = null println(b?.length) // will not be called println(a?.length) // Unnecessary safe call- 注:当b为
null时,安全调用操作符?.就会停止运行该处代码,防止报错
- 注:当b为
非空断言操作符
-
当一个变量为可空类型时,则调用该变量的属性时,除了用
安全调用操作符,还可以用非空断言操作符!!.: -
代码执行逻辑:变量不为
null时,就会执行,否则抛出异常 -
用法:
-
为
null时:fun main(args: Array<String>) { //可空类型变量 var age: String? = null //使用非空断言修饰符 val result = age!!.toInt() //打印结果 println(result) //随便打印一句话 println("非空断言修饰符后面的一句话") }运行结果:
Exception in thread "main" kotlin.KotlinNullPointerException -
不为
null时:fun main(args: Array<String>) { //可空类型变量 var age: String? = "18" //使用非空断言修饰符 val result = age!!.toInt() //打印结果 println(result) //随便打印一句话 println("非空断言修饰符后面的一句话") }运行结果:
18 非空断言修饰符后面的一句话
-
-
安全调用符和非空断言的对比:
-
注:非空断言操作符(!!.)会将任何变量(可空类型变量或者非空类型变量)转换为非空类型的变量,若该变量为空则抛出异常
空合并操作符(Elvis运算符)
-
如果要为可能为
null的变量,设置默认值,可以使用空合并操作符?: -
用法:
var strA: String? = "Hello" strA = null len = strA.length ?: -1 // 正常运行,结果为-1