Kotlin語言中是如何處理null值的?很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。
按需策劃設計可以根據(jù)自己的需求進行定制,做網(wǎng)站、成都網(wǎng)站設計構思過程中功能建設理應排到主要部位公司做網(wǎng)站、成都網(wǎng)站設計的運用實際效果公司網(wǎng)站制作網(wǎng)站建立與制做的實際意義
Kotlin null的處理詳解
NullPointerException,俗稱NPE,不管菜鳥還是老鳥們,都是不可避免,經(jīng)常遇到的一個異常,解釋起來很簡單,就“空指針”三個字??偸窃谝淮尾恍⌒模暨M這個陷阱里。Kotlin 的設計目標就是希望消除代碼中 null 引用帶來的危險, 也就是所謂的造成十億美元損失的大錯誤.
NPE的原因
盡管Kotlin希望消除代碼中的NPE,我們總是不小心,總會不小心又掉進NPE的陷阱,下面是可能NPE的原因:
避免NPE
在Kotlin中,明確區(qū)分可以指向 null 的引用 (可為 null 引用) 與不可以指向null的引用 (非null引用). 比如, 一個通常的 String 類型變量不可以指向 null:
var a: String = "abc" a = null // 編譯錯誤
此時,你對a變量的任何調(diào)用都是安全的,因為它為非null,你可以對該引用做任何操作而不會報NPE。就算對a賦值給Null,編譯器都會報錯,不會讓你通過。
可是,實際開發(fā)時,不可能所有的變量不會null,總會有情況,變量是null的,此時該如何設定該變量呢?要允許null值的變量, 我們可以將變量聲明為可為null的字符串, 寫作 String? :
var b: String? = "abc" b = null // ok
這樣,我們是解決了變量可以設置為null的問題,可NPE的這個陷阱又設上了,如果再粗心大意,NPE又來找麻煩了。
如果我們?nèi)匀恍枰L問這個屬性, 對不對? 有以下幾種方法可以實現(xiàn):
在條件語句中進行null檢查
通過條件語句,對變量檢查是否為null,對 null 和非 null 的兩種情況分別處理:
if (b != null && b.length > 0) print("String of length ${b.length}") else print("Empty string")
注:
該方案只是針對當前b的值,b的值在檢查以后,如果b的值被修改仍需對此值做非null檢查,也就是說每次修改b的值,都必須對b作非null驗證,這也導致了代碼的冗余。
安全調(diào)用
什么是安全調(diào)用?看起來有點不理解,既然是null怎么還會有安全呢?
b?.length
在Kotlin中,允許使用 “?.”操作符調(diào)用變量,其含義是如果b不是null,這個表達式將會返回b.length,否則返回 null.如果使用了”?.”,其表達式的值也應為 可為null的,比如Int?,否則編譯器會報錯。
bob?.department?.head?.name
安全調(diào)用在鏈式調(diào)用的情況下非常有用.這樣的鏈式調(diào)用, 只要屬性鏈中任何一個屬性為 null, 整個表達式就會返回 null.
?:操作符
如果 ?: 左側(cè)的表達式值不是null, 就會返回表達式的的值,否則, 返回右側(cè)表達式的值.
val l = b?.length ?: -1
如果b不為null,將返回b的長度,如果為null,將返回-1
注:
只有在左側(cè)表達式值為 null 時, 才會計算右側(cè)表達式.
由于在 Kotlin 中 throw 和 return 都是表達式, 因此它們也可以用在 Elvis 操作符的右側(cè). 這種用法可以帶來很大的方便, 比如, 可以用來檢查函數(shù)參數(shù)值是否合法。
fun foo(node: Node): String? { val parent = node.getParent() ?: return null val name = node.getName() ?: throw IllegalArgumentException(“name expected”) // … }
!! 操作符
對于b不為null的情況, 這個表達式將會返回這個非null值(比如, 在我們的例子中就是一個 String 類型值), 如果b是 null, 這個表達式就
會拋出一個 NPE:
val l = b!!.length()
當b為null時就拋出一個異常,你可以捕獲它,而不是在不知道在某一角落里調(diào)用時,才報出異常,抓頭撓腮半天,才找到NPE在哪里。
安全的類型轉(zhuǎn)換
如果對象不是我們期望的目標類型, 那么通常的類型轉(zhuǎn)換就會導致ClassCastException,可以選擇使用安全的類型轉(zhuǎn)換, 如果轉(zhuǎn)換不成功, 它將會返回 null,這樣避免了轉(zhuǎn)換異常的拋出。
val aInt: Int? = a as? Int
看完上述內(nèi)容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝您對創(chuàng)新互聯(lián)的支持。
文章名稱:Kotlin語言中是如何處理null值的
URL地址:http://aaarwkj.com/article38/ipdcsp.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供面包屑導航、網(wǎng)站改版、網(wǎng)站設計、ChatGPT、、網(wǎng)站收錄
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)