1. 程式人生 > 其它 >初識Kotlin 之4__可空指標檢查

初識Kotlin 之4__可空指標檢查

技術標籤:Kotlin

一. 在Kotlin 中, 預設所有的引數和變數都不可為空

看一個程式碼塊:

interface  Learn{
        fun readBooks()
        fun doSchoolwork()
    }


fun doLearn(learn: Learn){
        learn.readBooks()
        learn.doSchoolwork()
    }

這裡doLearn()傳入的引數一定不為空, 如果嘗試向其傳入一個null引數, 會提示報錯。如下圖所示

也就是說,Kotlin 將空指標異常的檢查提前到了編譯期, 寫入程式碼時就不能通過。

二. 如果一定需要某個引數或變數為空呢? Kotlin提供了另外一套為空的型別系統。

語法是: 在類名後面加上一個問號?

例如: Int表示不可為空的整型, Int?表示可為空的整型, String表示不可為空的字串, String?表示可為空的字串。

注意: 這時候可以傳入null, 但是在方法內要加上判斷處理不為空,如下所示:

fun doLearn(learn: Learn?){
        if(null != learn) {
            learn.readBooks()
            learn.doSchoolwork()
        }
    }

如果不加判斷,則報錯

三. 判空輔助工具

首先學習最常用的?.操作符,它的意思是當物件不為空時正常呼叫相應方法, 當物件為空時什麼都不做。

前面寫的if(null != learn){}, 可以這樣修改成這樣: learn?. 也就是說, doLearn()方法可以這樣修改:

fun doLearn(learn: Learn?){
            learn?.readBooks()
            learn?.doSchoolwork()
    }

藉助?. 將if判斷語句去掉了。

其次,現在再學習一個非常有用的?:操作符。 這個操作符的左右兩邊都接收一個表示式, 如果左邊表示式的結果不為空就返回左邊的結果, 否則就返回右邊表示式的結果。

看一段程式碼:

val  c=if(a != null){
    a
}else{
    b
}

使用?:操作符可以簡化成:

val c = a ?: b

現在,我們將?.和?:結合起來使用, 編寫一個方法用來獲得一段文字的長度, 傳統寫法是這樣寫:

fun  getTextLength(text: String?): Int{
    if(null != text){
        return  text.length
    }
    return 0
}

如果用操作符 就可以這樣寫:

fun  getTextLength(text: String?) = text?.length ?: 0

這兩種寫法實現的效果是一樣的: 當text不為空就返回它的長度,否則返回0

四 非空斷言工具

看一段程式碼:

程式碼 編譯不能通過! 因為printUpperCase()不知道外部已經對content變數進行了非空檢查, content 在呼叫toUpperCase()方法時,認為這裡存在空指標風險。

如果要想強行編譯通過, 可以使用非空斷言工具,語法是在物件的後面加上!! 如下所示:

注意: 這種寫法有風險, 它告訴Kotlin編譯環境, 不用你來檢查空指標了,如果出現問題,你直接丟擲空指標異常, 後果由我承擔。