做者:Antonio Leivaandroid
時間:Apr 4, 2017安全
原文連接:https://antonioleiva.com/nullity-kotlin/框架
關於Kotlin最重要的部分之一:無效處理,我花了很長時間完成寫一篇文章。ide
東尼·霍爾(Tony Hoare)「空(null)」概念的創做者,自稱「十億美圓的錯誤」。在你編寫Java代碼是,null是最容易出錯的指針。學習
若是你在觀察Bug管理器,我確信你見到的NullPointerException錯誤要超過90%。ui
多虧Kotlin,你將工做在更加安全的環境中(即便是用Java庫),它是這些問題儘可能減小。spa
除非你設定,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操做符容許咱們返回一個值:
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檢查。
以我看,極少有狀況須要這個操做符。老是有更好的解決方案。
可是,你可以這樣作:
1 val x: Int? = null 2 val y = x!!.toDouble()
這可以編譯,而且產生NullPointerException。
這就是爲何我說:要很是當心使用這個操做符。
當咱們使用Java庫時,咱們可能會發現本身要面對不一樣的null檢查狀況。
若是在Java和Android中,適當地使用@Nullable和@NotNull註解,Kotlin可以與其很好的對接,而且,可以指出變量何時是null,何時不是。
Android框架的許多部分已經正確的註解了,因此這是與Kotlin配合使用的巨大優點。
然而,若是庫沒有註解,類型將以特殊操做符(單一!)標註,這就意味着這是在咱們這邊決定一個參數或返回值是否接受null。
若是咱們閱讀源代碼,最好檢查代碼以決定是否容許使用null。
Android沒有註解的例子是RecyclerView支持庫。當你建立一個適配器和生成方法時,缺省是爲類型加詢問。
可是,若是您查看源代碼,會發如今須要覆蓋的方法中,沒有任何東西可以是null。
對全部Java開發者,NullPointerException是個噩夢,大多數狀況,這表示你的代碼發生錯誤了。
這在Kotlin中,很容易地將這類錯誤幾乎減小到零,即便使用Java框架和庫。
只有這樣,就可避免沒必要要的長時間的調試工做,並且可讓代碼更加穩定。
若是你要進一步的學習全部這些,且可以流利建立你本身的Android APP,我建議你找這本免費書學習怎樣建立你的第一個項目,或直接獲取這本書,學習怎樣從頭開始建立一個完整的APP。
---恢復內容結束---