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


 

作者:Antonio Leiva

時間:Apr 4, 2017

原文鏈接:https://antonioleiva.com/nullity-kotlin/

 

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

 

東尼·霍爾(Tony Hoare)“空(null)”概念的創作者,自稱“十億美元的錯誤”。在你編寫Java代碼是,null是最容易出錯的指針。

 

 

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

 

多虧Kotlin,你將工作在更加安全的環境中(即使是用Java庫),它是這些問題盡量減少。

 

KotlinNull

 

除非你設定,Kotlin不存在Null

 

也就是說,沒有變量缺省值能夠被設置成null。記住,在Kotlin中所有類型都是對象。

 

 

因此,不能編譯:

 

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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM