一、可null类型
为了避免java中经常出现的NullPointerException问题,Kotlin引入了对null的控制。
我们以整型为例。
- Int则一定不为null,使用其方法或属性时,可以正常调用
- 而Int?则有可能为null使用式,使用时需要进行先判空,否则无法正常调用其属性或方法
包括Boolean?
类型,也不能直接用作分支判断。 使用时需要用if(b == true)
进行判断,因为此时的b
的取值包括:true
、false
、null
var b:Boolean? = true
if(b == true){
println("b is ${b}")
}
二、安全调用
使用 ?
可进行安全调用。例如
var str2: String? = "zincPower"
// 无法直接调用
// println(str2.length)
// 只有当str2不为null时,则会调用length,得到长度,否则返回null
println(str2?.length)
str2 = null
// 返回null,不会NullPointerException
println(str2?.length)
使用 let
操作符,进行安全调用需要的代码逻辑
str2 = "jpy"
// 会调用后续的代码逻辑
str2?.let {
println("My name is $str2.")
}
str2 = null
// 后续的代码逻辑不会被调用
str2?.let {
println("My name is $str2.")
}
三、Elvis 运算
对 if 分支的简化,即?:
,当?:
不为null,则返回?:
左边的表达式,否则返回?:
右边表达式。
var str3:String? = "XPY"
println(str3?:"It's null")
str3 = null
println(str3?:"It's null")
四、强制调用
使用!!.
则可以忽略变量是否需要进行检测null。但有可能会引起NullPointerException
str3:String? = null
str3!!.length