Kotlin-空值和空类型
变量除了能引用一个具体的值之外,还有一种特殊的值,那就是 null
, 它代表空值, 也就是不引用任何对象
在Kotlin中, 对空值的处理是非常严格的,正常情况下,我们的变量是不能直接赋值为 null
的,否则无法编译通过, 这直接在编译阶段就避免了空指针问题
Kotlin中所有的类型默认都是非空类型。如果我们希望某个变量在初始情况下使用 null
而不去引用某一个具体对象, 此时就需要将变量的类型修改为可空类型,只需要在类型名称的后面添加一个?
即可:
fun main() {var str: String? = null
}
既然现在是可空类型,那么当一个变量为null
时,这时候使用类的一些成员方法或是获取成员属性时, 会出现一些问题:
此时为了安全,就需要对变量进行判断
fun main() {var str: String? = nullif (str != null) {println(str.length)}
}
不过有些情况下,我们已经非常清楚一定不为null。即便它是一个可空类型的变量,也要调用成员方法或是获取成员属性
fun main() {var str: String? = null// 使用非空断言操作符 !!. 来明确不会出现 null 问题println(str!!.length)
}
虽然使用非空断言操作符能够进行强制操作,但是这样实际上并不安全
Kotlin为我们提供了一种更为安全的空类型操作,更安全地访问可能包含null
值的对象,也就是安全调用运算符?.
fun main() {var str: String? = nullprintln(str?.length)
}
fun main() {var str: String? = "abc"println(str?.length)
}
有时候我们希望如果变量为null
,在使用安全调用运算符时,返回一个我们自定义的结果,而不是null
。这时候我们可以使用 Elvis运算符?:
- 左侧为
null
,返回右侧自定义的值 - 左侧不为
null
,返回左边
fun main() {val str: String? = nullval len = str?.length ?: 0println(len)
}
fun main() {val str: String? = "abc"val len = str?.length ?: 0println(len)
}