可空類型主要是為了從編譯層面盡可能的減少NPE。
在Kotlin中申明一個變量,如果類型后面不加?則不能直接給此變量賦值為null,在類型后面加上?就變成了可空類型,而可空類型可以直接賦值為null
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時,拋出空指針異常
再來看一個在表達式中多次調用?.的例子
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中的三目運算符,但是容易混淆的,所以我也放到次數記錄下來
這個是干啥的呢,直接看代碼說話吧
fun main(args: Array<String>) { var name: String? = null var nameLen: Int = name?.length ?: 0 //僅僅在左邊的表達式結果為空時才會計算?:后面的表達式 println(nameLen) }
