1. 程式人生 > 其它 >kotlin中的空指標檢查問題

kotlin中的空指標檢查問題

空指標檢查

Android系統上崩潰率最高的異常型別就是空指標異常。

我們需要知道的是:空指標是一種不受程式語言檢查的執行時異常,只能有程式設計師主動通過邏輯判斷來避免。

舉個例子,對於一段簡單的呼叫引數的Java程式碼,我們要使程式碼安全性更高,更穩妥的做法就是再呼叫引數的方法之前先進行一個判空處理。如下:

public void doStudy(Study study){
if(study !=null){
study.readBook();
study.doHomework();
}

可空型別系統

相較於Java,kotlin非常科學的解決了這個問題,它利用編譯時判空檢查的機制基弧杜絕了空指標異常。雖然編譯時判空機制有時候導致程式碼更難書寫,但kotlin提供的多種輔助工具可以很好的處理各種判空情況

在類名的後面加上一個問號,例如Int表示不可為空的整形,而Int?就表示可為空的整形。

判空輔助工具

?.操作符

對於上面的doStudy()函式,如果我們希望傳入的引數可以為空,那麼就可以如下進行實現:

fun main(){
doStudy(null)
}
fun doStudy(study:Study?){
study?.readbook()
study?.doHomework()
//注意當我們將引數修改為了可為空的Study?時,呼叫引數的readbook()和doHomework()方法都可能造成空指標異常,因此這種情況下就需要通過藉助?.操作符將空指標異常都處理掉
}

?:操作符

這個操作符左右兩邊都接收了一個表示式,當左邊表示式的結果不為空則返回左邊表示式的結果,否則就返回右邊表示式的結果

舉例如下:

var m:String?="hello"
var m2:String?=null
fun main(){
var c1=m2?:m
println(c1)
}
/*
上面這段程式碼中的 var c1=m2?:m 等價於如下程式碼:
val c=if(m2!=null){
m2
}
else{
m
}
*/

非空斷言工具

!!.操作符

當我們在main( )函式裡先進行一次判空操作,裡面呼叫一個函式。此時我們是無法通過編譯的,因為呼叫的函式並不知道外部已經進行了非空檢查,在呼叫函式時依舊認為這裡面存在空指標風險,從而無法編譯通過

這種情況下,我們想要強行通過編譯,就可以使用非空斷言工具,寫法是在物件的後面加上!!,如下所示:

var m:String?="hello"
fun main(){
if(m!=null){
printUpperCase()
}
}

fun printUpperCase(){
val uppercase=m!!.toUpperCase()
println(uppercase)
}

需要注意的是這是一種有風險的寫法,意在告訴kotlin,我非常確信這裡的物件不會為空,所以不需要繼續執行空指標檢查;如果出現問題kotlin可以直接丟擲異常,後果由我自己承擔。