空安全 (Null Safety)
kotlin 相比于 Java 的第一个核心技术优势 是 空安全。
Kotlin 在类型系统中集成了 空安全机制。
能够在编译时 检测潜在的 空指针 异常,
- 编译时检查: kotlin 区分可空类型(如 String?) 和 非空类型(如 String )
- 安全调用操作符: 提供?. 操作符, 可以在对象为空时 安全的 调用方法 或访问属性。 而不会引发一场。
- Elvis 操作符: 提供 ?: 操作符
安全调用操作符(Safe Call Operator)示例
kotlin
// Java 写法(容易出现 NullPointerException)
String name = user.getAddress().getCity().getName();
// 如果 getAddress() 或 getCity() 返回 null,就会抛出异常
// Kotlin 写法(安全调用)
val name = user.address?.city?.name
// 如果任何一个属性为 null,整个表达式返回 null,不会抛出异常
Elvis 操作符示例
kotlin
// Kotlin 中使用 Elvis 操作符提供默认值
val name = user.name ?: "未知用户"
// 如果 user.name 为 null,则使用 "未知用户" 作为默认值
// 更复杂的 Elvis 操作符用法
fun getLength(name: String?): Int {
return name?.length ?: 0 // 如果 name 为 null,返回 0
}
// Elvis 操作符还可以用于提前返回或抛出异常
fun processUser(user: User?) {
val userName = user?.name ?: return // 如果 user 或 name 为 null,直接返回
println(userName)
}
对比 Java 的传统写法
kotlin
// Java 中需要大量 null 检查
String name;
if (user != null && user.getAddress() != null && user.getAddress().getCity() != null) {
name = user.getAddress().getCity().getName();
} else {
name = "未知";
}
// Kotlin 简洁写法
val name = user?.address?.city?.name ?: "未知"