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