Kotlin可空類型與? ?: ?. !!

可空類型主要是爲了從編譯層面儘量的減小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)
}
相關文章
相關標籤/搜索