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)
}

