變量除了能引用一個具體的值之外,還有一種特殊的值,那就是 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)
}