null和null安全
非空类型和可空类型
Kotlin 系统类型分为可空类型和不可空类型。 Kotlin 中引入了可空类型,把有可能为 null 的值单独用可空类型来表示。这样就在可空引用与不可空引用之间划分出一条明确的、 显式的“界线”。
在Kotlin中,在定义变量时,给变量类型后增加?
后缀,来标记类型是否可为空:
var str = "hahaha"
// toIntOrNull方法:str 转换 int,如果转换失败,则转换为null
var num: Int = str.toIntOrNull() // 无法通过编译
var num: Int? = str.toIntOrNull() // 能够通过编译
println(num)
上述代码Int?
就是一个可空类型,可以给他一个null值。
可空类型必须判断才能使用
可空类型的变量不允许直接调用方法或属性,但可以先判断该变量不为 null,然后再调用 该变量的方法或属性。
var a :String? = ""
// a.toBigDecimal() // 直接调用报错
if (a != null) {
a.toBigDecimal()
}
对于Boolean类型:
var b: Boolean? = null
// 以下代码正确
if(b == true){
println("为真")
}
// 以下代码报错,null不能作为条件
if (b) {
println("为真")
}
安全调用
// 如果item不为空,才调用let函数
item?.let { println(it) }
强制调用
Kotlin 用 “!!.” 即可强制调用可空变量的方法或属性,这样强制调用可能引发 NPE:
item!!.let { println(it) }
Elvis运算
Elvis运算是一种if-else的简化写法:
var b: String? = "Kotlin"
// 先判断 b 不为 null,然后访问 b 的 length 属性
var len1 = if (b != null) b.length else -1
println(len1) // 输出 6
b = null
// 使用 Elvis 运算符, 如果b不等于null,返回长度,否则返回-1
var len2 = b?.length ?: -1
println(len2) // 输出 -1
最后更新于
这有帮助吗?