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


可空類型主要是為了從編譯層面盡可能的減少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)
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM