可空类型 / 非空类型 基础
在 Kotlin 中,类型系统默认是非空的,赋值 null 会导致编译错误。可空类型通过 ? 标记。
fun main() {
// 非空类型:不能赋值 null
var normalStr: String = "Hello"
// normalStr = null // 编译报错
// 可空类型:加 ? 允许为 null
var nullableStr: String? = null
nullableStr = "Kotlin"
}
?. 空安全调用
对象为 null 时不执行后面方法,直接返回 null,不会 NPE。
fun main() {
var str: String? = null
// 安全调用:null 就短路,不报错
val len = str?.length
println(len) // null
str = "Android"
println(str?.length) // 7
}
?: Elvis 埃尔维斯运算符
为空时给默认值,语法:表达式 ?: 默认值
fun main() {
var str: String? = null
// 为 null 取后面默认值
val realStr = str ?: "默认字符串"
println(realStr) // 默认字符串
str = "Kotlin"
val realStr2 = str ?: "默认字符串"
println(realStr2) // Kotlin
// 常用:为空直接 return
val name: String? = null
val info = name ?: return
println("不会走到这里")
}
!! 非空断言
强行告诉编译器:一定不为 null,出错直接抛 NPE,慎用,业务代码尽量避免。
fun main() {
var str: String? = "测试"
// 强行断言非空
println(str!!.length)
// 一旦真的为 null,直接崩溃 NPE
str = null
// println(str!!.length) // 运行时 NullPointerException
}
组合用法:?. + ?: 最常用标准写法
fun main() {
val str: String? = null
// 为空调用默认值,不为空取长度
val length = str?.length ?: 0
println(length) // 0
}
Kotlin 调用 Java 代码时,平台类型可空性模糊,容易 NPE。Java 返回的类型在 Kotlin 中可能既可以当 String 也可以当 String?。
空安全体系总结
- Type? 标记可空,默认 Type 不可空
- ?. 安全调用,null 直接短路
- ?: 空就给默认值 / 空就 return
- !! 强行断言,慎用,容易 NPE
- 优先用
?.和?:,杜绝无脑!!