Kotlin的可空類型
在以往的Java開發中有一個著名的異常NullPointerException,俗稱NPE,它由訪問爲空的屬性引發,爲此Kotlin中引入了可空類型,旨在有效消除NPE異常的發生。
在定義變量的時候在其類型的後面加上一個?
問號表示該變量是可空類型,可以賦予其null值。比如
//定義可空變量,並賦予null值
var a: String?
a = null
//定義一個非空變量,賦予null值的發生錯誤
var b: String
b = null // Null can not be a value of a non-null type String
可空類型的特點
- 可空類型變量可以存放null值。
- 可空類型變量不能賦值爲不可空變量,包括非空類型的形參
- 不能直接調用可空類型的方法和屬性
安全調用可空類型: ?.
創建一個var a: String? = "abc"
創建了一個可空的字符串類型變量a
那麼調用變量a
的方法前需要判斷其是否爲null,比如使用if…else判斷
println(if(a != null) a.toUpperCase() else a)
在Kotlin中提供了一個非常方便的語法糖,可以將上面的if…else語句,使用?.
比如println(a?.toUpperCase())
Elvis運算符:?:
看一個Elvis運算符的例子:
//定義一個字符串變量a,如果不爲空輸出其值,如果爲空輸出“aa”
var a: String? = "a"
val b = "aa"
println(a?:b) //輸出爲a
a = null
println(a?:b) //輸出爲aa
通過上面的例子可以看出Elvis運算符的函數就是當變量a
不爲空,表達式的值就是a
,如果爲空表達式的值就是b
非空斷言:!!
操作符
可空類型的變量不能直接調用,一般要麼進行if…else判斷,要麼使用?.
操作符進行安全調用,除此以外
Kotlin中提供了!!
操作符,將一切可空的值轉換爲不可空的值,從而直接調用變量的方法和屬性,
如果可控變量的值爲null,將發生NPE異常。
參考
- 《Kotlin實戰》
- 空安全-Kotlin語言中文站