Kotlin可空和非可空型別


Kotlin null安全性是一種消除程式碼中空參照風險的過程。 如果Kotlin編譯器發現任何null引數而仍然執行null參照相關語句,則會立即丟擲NullPointerException

Kotlin的型別系統旨在消除程式碼中的NullPointerExceptionNullPointerException只能用於以下原因:

  • 強行呼叫丟擲NullPointerException;
  • 未初始化此運算子,可在建構函式中傳遞並在某處使用。
  • 使用外部Java程式碼作為Kotlin,是Kotlin與Java互操作性。

Kotlin可空型別和非可空型別

Kotlin型別系統區分可以保持null(可空參照)和不能保持null(非null參照)的參照。 通常,String型別不可為null。 要建立儲存null值的字串,必須通過放置一個?來明確定義它們。 例如,在String後面使用:String?

可空型別

通過放置一個?來宣告可空型別? 在String後面:

var str1: String? = "hello"  
str1 = null // ok

Kotlin可空型別的例子

fun main(args: Array<String>){  
    var str: String? = "Hello" // 變數被宣告為可空
    str = null  
    print(str)  
}

執行上面範例程式碼,得到以下結果 -

null

非可空型別

非可空型別是普通字串,它們宣告為String型別:

val str: String = null // compile error  
str = "hello" // compile error Val cannot be reassign  
var str2: String = "hello"  
str2 = null // compile error

null值賦給非可空字串時會發生什麼?

fun main(args: Array<String>){  
    var str: String = "Hello"  
    str = null // compile error  
    print(str)  
}

它將生成編譯時錯誤,如下所示 -

Error:(3, 11) Kotlin: Null can not be a value of a non-null type String

在條件中檢查null

Kotlin的if表示式用於檢查條件並返回值。

fun main(args: Array<String>){
    var str: String? = "Hello"     // variable is declared as nullable
    var len = if(str!=null) str.length else -1
    println("str is : $str")
    println("str length is : $len")

    str = null
    println("str is : $str")
    len = if(str!=null) str.length else -1
    println("b length is : $len")
}

執行上面範例程式碼,得到以下結果 -

str is : Hello
str length is : 5
str is : null
b length is : -1