可空類型主要是爲了從編譯層面儘量的減小NPE。ui
在Kotlin中申明一個變量,若是類型後面不加?則不能直接給此變量賦值爲null,在類型後面加上?就變成了可空類型,而可空類型能夠直接賦值爲nullspa
var name: String = null//Error:Null can not be a value of a non-null type String var name1: String? = null//可空類型,能夠賦值爲null
那麼可空類型和普通的類型在使用上有什麼區別呢,這就涉及到另兩個運算符?.與!!的用法指針
fun main(args: Array<String>) { var name: String = "liuliqianxiao" print(name.length)//正常使用便可,由於是非空類型,能夠放心使用,不用判斷if(name != null) var name1: String? = null//可空類型,能夠賦值爲null //這麼調用時錯誤的 // print(name1.length)//Error:Only safe (?.) or non-null asserted (!!.) calls are allowed on a nullable receiver of type String? //傳統用法 if(name1 != null){ print(name1.length) } //kotlin風格的用法 print(name1?.length) //當name1是null時,會輸出null //或者這麼使用 print(name1!!.length)//當name1是null是報npe錯誤 }
?.就是當前面的變量!= nuil 時正常調用,若是爲null就爲null,!!就是當變量爲null時,拋出空指針異常code
再來看一個在表達式中屢次調用?.的例子blog
class User() { var userName: String? = null } fun main(args: Array<String>) { var user: User? = null print(user?.userName?.length)//user==null 或者 userName==null都會輸出null }
最後說一個?:操做符,elvis操做符,這個其實和可空類型沒啥關係,這個也不是Java中的三目運算符,可是容易混淆的,因此我也放到次數記錄下來編譯
這個是幹啥的呢,直接看代碼說話吧class
fun main(args: Array<String>) { var name: String? = null var nameLen: Int = name?.length ?: 0 //僅僅在左邊的表達式結果爲空時纔會計算?:後面的表達式 println(nameLen) }