前言
当我们使用 Java 开发的时候,如果不想遇到
NullPointerException
,我们就需要在使用它之前不停的判断它是否为 null,而 Kotlin 是空安全的,我们在编译时期就处理了各种 null 的情况,避免了执行时异常。
空安全
// 不能通过编译,Artist 不能是 null
var notNullArtist : Artist = null
// Artist 可以是 null
var artist: Artist? = null
// 无法编译, artist可能是null,我们需要进行处理
artist.print()
// 只要在artist != null时才会打印
artist?.print()
// 只有在确保artist不是null的情况下才能这么调用,否则它会抛出异常
artist!!.print()
// 使用Elvis操作符来给定一个在是null的情况下的替代值
val name = artist?.name ?: "empty"
1. 安全调用符 ?.
?. 会被编译为一个三目运算表达式,如果 ?. 前的对象不为 null,则调用 ?. 后的方法或属性,否则返回 null。
2. Elvis 操作符 ?:
Elvis 操作符是三目条件运算符的简略写法,用于指出一个是 null 的情况下的替代值。
Kotlin 中可以用 Elvis 操作符配合安全调用符,实现简单清晰的空检查和空操作。
转化关系:
-
A ?: B
等价if (A == null) B
-
A?.B ?: C
等价if (A != null) A.B else C
不建议广泛使用!!操作符
Kotlin 不建议在代码中广泛使用 !! 操作符,这回浪费 Kotlin 设计良好的非空类型,每一个 !! 都意味着一个未处理的
NullPointerException
,让 Kotlin 代码充斥着 NPE
1. 用 val 而不是 var
在 Kotlin 中 val 代表只读,var 代表可变。val 是线程安全的,而且不需要担心 null 的问题。
2. 使用lateinit
在 Android 定义一些成员变量的时候,经常需要在 onCreate 方法中初始化,这个时候我们就用不了 val,针对这种情况,Kotlin 提供了 lateinit 关键字,就和其表面意思一样,“晚些初始化”。
3. 使用 Elvis 操作符
指出一个 null 情况下的替代值。
4. 使用 let 函数
let 函数定义就是,默认当前这个对象作为闭包的it参数,可以 return 返回函数的执行结果。一般要与安全调用符配合使用:
private var msg: String? = null
fun main(args: Array<String>) {
msg = "Kotlin from ysan"
var a = msg?.let { sendMessage(it) }
}
fun sendMessage(message : String) {
for (s in message) {
println(s)
}
}
网友评论