初識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編譯環境, 不用你來檢查空指標了,如果出現問題,你直接丟擲空指標異常, 後果由我承擔。