寫在前面
對於每個Java開發人員,上面的這個異常應該都不會陌生,空指針異常是Java裡面最常見也最頻繁出現的一個異常,因此在Java中經常會出現判斷是否為null的代碼,對此我們不勝其煩,Kotlin的出現讓人眼前一亮,其中就包括它的空安全特性。
空安全
在Kotlin中,類型系統將可空類型和不可空類型進行了區分,例如,聲明一個字符串變量時String為不可空類型,String?則為可空類型,如果將不可空類型賦值為null將會編譯不通過。
對於不可空類型,可以直接調用它的成員變量或者函數,但是對於可空類型,直接調用成員變量或者函數將會編譯不通過,相當於直接在語法層面做出了限制。例如像上面的代碼中要執行 name.length 會編譯不通過,上面這些特性就是Kotlin中的空安全,它最大限度的避免了空指針異常的出現。
空值處理
既然空值不能直接調用它的成員變量或者函數,那正確的處理方式是什麼樣的呢?
1、和Java一樣進行null判斷
name的值不為空則返回長度否則返回-1,並且這裡直接可以把if-else作為一個表達式返回給一個變量,這也體現出Kotlin語法比較靈活。
2、Kotlin的空安全檢查
使用?.來調用成員變量或者函數,它會進行空安全檢查,只有在安全的情況下才會執行,否則返回null,另外這裡使用了Kotlin的三元運算符 ?: 整個代碼運行邏輯就是不為空返回變量的長度,否則返回-1
3、忽略空安全-拋出異常
!!.是用來忽略空安全檢查的,不管是否為空都會執行,當為空的時候則會拋出空指針異常,但是,Kotlin並不建議在代碼中廣泛使用!!操作符,因為這樣會浪費Kotlin良好的非空類型的設計,讓Kotlin代碼中充斥著NPE。
下面總結一下,對於可空引用,如果希望調用它的成員變量或者成員函數,直接調用會出現編譯錯誤,有三種方式處理
- 在調用前,通過if-else進行空判斷;
- 使用 ?. 的形式調用,如果為null,返回null,否則返回對應的值;
- 使用 !!. 的形式調用,如果為null,拋出空指針異常,否則返回對應的值;
原理
Kotlin具備空安全的特性,到底用了什麼黑科技呢,其實看下源碼並沒什麼高深的東西;
上面的代碼中定義了一個參數不可為空的函數,它在編譯的時候會編譯成下面的Java代碼,可以看見,首先參數添加了NotNull的註解,同時調用了checkParameterIsNotNull這個檢查空的函數,為空則會拋出IllegalArgumentException異常。
喜歡就關注我,每天更新前後端開發相關的資料。