前言
當(dāng)我們使用 Java 開發(fā)的時候盲链,如果不想遇到
NullPointerException
队秩,我們就需要在使用它之前不停的判斷它是否為 null蓄愁,而 Kotlin 是空安全的掂恕,我們在編譯時期就處理了各種 null 的情況限煞,避免了執(zhí)行時異常庇绽。
空安全
// 不能通過編譯锡搜,Artist 不能是 null
var notNullArtist : Artist = null
// Artist 可以是 null
var artist: Artist? = null
// 無法編譯, artist可能是null癣猾,我們需要進(jìn)行處理
artist.print()
// 只要在artist != null時才會打印
artist?.print()
// 只有在確保artist不是null的情況下才能這么調(diào)用,否則它會拋出異常
artist!!.print()
// 使用Elvis操作符來給定一個在是null的情況下的替代值
val name = artist?.name ?: "empty"
1. 安全調(diào)用符 ?.
?. 會被編譯為一個三目運(yùn)算表達(dá)式余爆,如果 ?. 前的對象不為 null纷宇,則調(diào)用 ?. 后的方法或?qū)傩裕駝t返回 null蛾方。
2. Elvis 操作符 ?:
Elvis 操作符是三目條件運(yùn)算符的簡略寫法像捶,用于指出一個是 null 的情況下的替代值。
Kotlin 中可以用 Elvis 操作符配合安全調(diào)用符桩砰,實現(xiàn)簡單清晰的空檢查和空操作拓春。
轉(zhuǎn)化關(guān)系:
-
A ?: B
等價if (A == null) B
-
A?.B ?: C
等價if (A != null) A.B else C
不建議廣泛使用!!操作符
Kotlin 不建議在代碼中廣泛使用 !! 操作符,這回浪費(fèi) Kotlin 設(shè)計良好的非空類型亚隅,每一個 !! 都意味著一個未處理的
NullPointerException
硼莽,讓 Kotlin 代碼充斥著 NPE
1. 用 val 而不是 var
在 Kotlin 中 val 代表只讀,var 代表可變煮纵。val 是線程安全的懂鸵,而且不需要擔(dān)心 null 的問題。
2. 使用lateinit
在 Android 定義一些成員變量的時候行疏,經(jīng)常需要在 onCreate 方法中初始化匆光,這個時候我們就用不了 val,針對這種情況酿联,Kotlin 提供了 lateinit 關(guān)鍵字终息,就和其表面意思一樣,“晚些初始化”贞让。
3. 使用 Elvis 操作符
指出一個 null 情況下的替代值周崭。
4. 使用 let 函數(shù)
let 函數(shù)定義就是,默認(rèn)當(dāng)前這個對象作為閉包的it參數(shù)喳张,可以 return 返回函數(shù)的執(zhí)行結(jié)果续镇。一般要與安全調(diào)用符配合使用:
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)
}
}