37-可空类型与不可空类型
4.10.1 可空类型与不可空类型
Kotlin类型系统旨在从代码层面上消除NullPointerException,为了实现这一目标,它将可空类型和不可空类型进行了明确的区分,Kotlin中绝大部分的对象都是不可空类型。例如,String类型的常规变量不能容纳null。
var a: String = "abc"
a = null //编译错误
如果允许为空,则可以将变量声明为可空字符串:String?。
var b: String? = "abc"
b = null //编译通过
此时,如果直接调用变量a的方法或者访问它的属性,是不产生NPE的。
val l = a.length //编译通过,因为a.length不会产生NPE
对于不可空类型,可以直接调用它的成员变量或者函数,但是对于可空类型,直接调用它的成员变量或者函数将会导致编译不通过。
val l = b.length //编译错误,因为b可能为null
对此,Kotlin提供了一种安全的可空引用操作符(?.)。
var b: String? = "abc"
b?.length // 编译通过,输出3