Kotlin的可空類型
在以往的Java開發(fā)中有一個著名的異常NullPointerException,俗稱NPE啸盏,它由訪問為空的屬性引發(fā)重贺,為此Kotlin中引入了可空類型,旨在有效消除NPE異常的發(fā)生回懦。
在定義變量的時候在其類型的后面加上一個?
問號表示該變量是可空類型气笙,可以賦予其null值。比如
//定義可空變量怯晕,并賦予null值
var a: String?
a = null
//定義一個非空變量潜圃,賦予null值的發(fā)生錯誤
var b: String
b = null // Null can not be a value of a non-null type String
可空類型的特點
- 可空類型變量可以存放null值。
- 可空類型變量不能賦值為不可空變量舟茶,包括非空類型的形參
- 不能直接調(diào)用可空類型的方法和屬性
安全調(diào)用可空類型: ?.
創(chuàng)建一個var a: String? = "abc"
創(chuàng)建了一個可空的字符串類型變量a
那么調(diào)用變量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運算符的函數(shù)就是當(dāng)變量a
不為空,表達式的值就是a
,如果為空表達式的值就是b
非空斷言:!!
操作符
可空類型的變量不能直接調(diào)用胀瞪,一般要么進行if..else判斷针余,要么使用?.
操作符進行安全調(diào)用,除此以外
Kotlin中提供了!!
操作符凄诞,將一切可空的值轉(zhuǎn)換為不可空的值圆雁,從而直接調(diào)用變量的方法和屬性,
如果可控變量的值為null幔摸,將發(fā)生NPE異常摸柄。
參考
- 《Kotlin實戰(zhàn)》
- 空安全-Kotlin語言中文站