Java中常常会因为空值导致空指针异常,因为java允许在变量初始化时,没有赋值的话默认是空值
而kotlin恰好相反,除非做特定声明,否则不能为空,并且在编译时期就会做出提醒
并非所有变量都需要做特殊处理,只有那些可能为空的字段,比如后台服务器返回的字段,为了避免空指针异常,才需要处理。
又或者直接将变量设置为null,也需要做一些处理。
先看一下不用处理的情况:
var string:String = "hello" //正常声明
fun main(args: Array<String>) {
string = "Hello Kotlin"
println("string的值:$string string的长度 ${string.length}") //正常使用
}
运行结果:
下面看一下会编译出错的情况:
空处理方式一:使用 安全调用操作符?
var string:String? = "" //在数据类型后面加?
fun main(args: Array<String>) {
string = null
println("string 的长度:${string?.length}") //使用该变量的时候也要加?
}
运行结果:
可以看到如果数据为空,那空的数据就会打印为null
空处理方式二:?配合使用非空断言操作符 !!. (用于需要抛异常的场景)
var string:String? = ""
fun main(args: Array<String>) {
string = null
println("string 的长度:${string!!.length}")
}
运行结果:
空处理方式三:?配合使用let. (用于需要处理多种情况的数据)
var string:String? = ""
fun main(args: Array<String>) {
string = "hello kotlin"
string.let {
if(string?.length!! > 10){ //要加一个!!的非空断言
string = "hello kotlin hello kotlin"
}else{
string = "hello"
}
}
println("string :$string")
}
运行结果:
空处理方式四:?配合使用?:(空合并操作符).
var string:String? = ""
fun main(args: Array<String>) {
string = "hello kotlin"
println("string 的长度:${(string?:"hello").length}")
string = null
println("string 的长度:${(string?:"hello").length}")
}
?:的意思就是如果为空,取?:右边的值,不为空就是变量的值,有点像缩略版的java三目运算符
运行结果: