再見NullPointerException。在Kotlin裏null的處理(KAD 19)

 

做者:Antonio Leivaandroid

時間:Apr 4, 2017安全

原文連接:https://antonioleiva.com/nullity-kotlin/框架

 

關於Kotlin最重要的部分之一:無效處理,我花了很長時間完成寫一篇文章。ide

 

東尼·霍爾(Tony Hoare)「空(null)」概念的創做者,自稱「十億美圓的錯誤」。在你編寫Java代碼是,null是最容易出錯的指針。學習

 

 

若是你在觀察Bug管理器,我確信你見到的NullPointerException錯誤要超過90%ui

 

多虧Kotlin,你將工做在更加安全的環境中(即便是用Java庫),它是這些問題儘可能減小。spa

 

KotlinNull

 

除非你設定,Kotlin不存在Null指針

 

也就是說,沒有變量缺省值可以被設置成null。記住,在Kotlin中全部類型都是對象。調試

 

 

所以,不能編譯:code

 

1 val x: Int = null

 

 

若是要變量接受Null,你必須爲類型加上問號(?):

1 val x: Int? = null

 

編譯時檢查

 

 

然而,從這點來講,編譯器強制你在對該變量作任何事情以前檢查變量是否爲null。這確保NullPointerException不會發生。

 

 

例如:

 

1 val y = x.toDouble()

 

 

若是你不先檢查是否爲null,則不能編譯,必須這樣:

1 if (x != null) {
2     val y = x.toDouble()
3 }

 

安全訪問表達

 

 

有一個更容易的方法表示前面的例子,在調用方法時,在「.」以前加個問號(?)。

 

若是變量不是null,它將執行操做。不然,它不作任何事情:

1 val y = x?.toDouble()

 

在這種狀況下,若是 x null,那麼表達式將返回null。因此,y將是Double?類型。

 

 

Elvis操做符

 

可是,若是咱們不但願有一個能夠爲空變量做爲操做結果怎麼辦?在這種狀況下,Elvis操做符容許咱們返回一個值:

1 val y = x?.toDouble() ?: 0.0

 

這行代碼等效:

 

1 val y = if (x != null) {
2     x.toDouble()
3 } else {
4     0.0
5 }

 

 

注意:

如你所見,Kotlin中大多數語句都轉化爲表達式。例如,你可以將if的結果賦值給變量。

 

 

避免null檢查

 

若是你確信變量不可能爲null,能夠用操做符(!!)能夠避免null檢查。

 

 

以我看,極少有狀況須要這個操做符。老是有更好的解決方案。

 

 

可是,你可以這樣作:

 

1 val x: Int? = null
2 val y = x!!.toDouble()

 

 

這可以編譯,而且產生NullPointerException

 

這就是爲何我說:要很是當心使用這個操做符。

  

Java支持

 

當咱們使用Java庫時,咱們可能會發現本身要面對不一樣的null檢查狀況。

 

 

庫恰當的註解

 

 

若是在JavaAndroid中,適當地使用@Nullable@NotNull註解,Kotlin可以與其很好的對接,而且,可以指出變量何時是null,何時不是

 

 

Android框架的許多部分已經正確的註解了,因此這是與Kotlin配合使用的巨大優點。

 

庫沒有註解

 

 

然而,若是庫沒有註解,類型將以特殊操做符(單一!)標註,這就意味着這是在咱們這邊決定一個參數或返回值是否接受null

 

 

若是咱們閱讀源代碼,最好檢查代碼以決定是否容許使用null

 

Android沒有註解的例子是RecyclerView支持庫。當你建立一個適配器和生成方法時,缺省是爲類型加詢問。

 

可是,若是您查看源代碼,會發如今須要覆蓋的方法中,沒有任何東西可以是null

 

結論

 

 

對全部Java開發者,NullPointerException是個噩夢,大多數狀況,這表示你的代碼發生錯誤了。

 

 

這在Kotlin中,很容易地將這類錯誤幾乎減小到零,即便使用Java框架和庫。

 

只有這樣,就可避免沒必要要的長時間的調試工做,並且可讓代碼更加穩定。

 

 

若是你要進一步的學習全部這些,且可以流利建立你本身的Android APP,我建議你找這本免費書學習怎樣建立你的第一個項目,或直接獲取這本書,學習怎樣從頭開始建立一個完整的APP

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

---恢復內容結束---

相關文章
相關標籤/搜索