Kotlin如何避免NullPointerException

Thu, Nov 4, 2021 閱讀時間 1 分鐘

NullPointerException已經可以說是java開發者的日常😱,只要程式邏輯上任何一處沒有經過深思熟慮都可能引發NPE的異常,那我們來看看kotlin在這一點上如何擺脫我們的困擾而做到Null safety

首先我們知道java會發生NPE的原因就是一個變數參考到null(null reference),而沒有指向一個物件實體,這時候你去調用這個變數的成員函數或屬性,就會拋出NullPointerException,所以在kotlin就把變數型態分成非空(預設)和允許空值的兩種型態,我們來看kotlin提供的幾個運算子和以下的例子

  • ? (safe call operator):kotlin幫你做null check後,如果不為空再往下呼叫
  • !! (not-null assertion operator):你堅持不為空,所以必須自己處理判斷邏輯,否則會引發NPE,不過這樣就沒有享受到kotlin帶給我們Null safety的好處,因此不建議採用這個方式
  • ?: (Elvis operator):這個類似常見的NVL方法,如果第一個運算元為空,就回傳第二個運算元當作預設值
fun main() {
    var a: String = "non-null type"
    var b: String? = "nullable type"
    // a = null 錯誤,cannot be set to null
    b = null // can be set to null
    println(b)
    println(b?.length) // Safe calls,如果b為空值則回傳null
    val aInt: Int? = a as? Int // Safe casts,強制轉型失敗會回傳null,就不會拋出異常
    // val l = b!!.length // throw an NPE if b is null
    val l = b?.length ?: -1
    println(l) // -1
}