国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務(wù)器之家 - 編程語言 - Java教程 - Kotlin null的處理詳解

Kotlin null的處理詳解

2020-11-09 15:26行云間 Java教程

這篇文章主要介紹了Kotlin null的處理詳解的相關(guān)資料,需要的朋友可以參考下

Kotlin null的處理詳解

NullPointerException,俗稱NPE,不管菜鳥還是老鳥們,都是不可避免,經(jīng)常遇到的一個異常,解釋起來很簡單,就“空指針”三個字。總是在一次不小心,而掉進這個陷阱里。Kotlin 的設(shè)計目標就是希望消除代碼中 null 引用帶來的危險, 也就是所謂的造成十億美元損失的大錯誤.

NPE的原因

盡管Kotlin希望消除代碼中的NPE,我們總是不小心,總會不小心又掉進NPE的陷阱,下面是可能NPE的原因:

  1. 明確調(diào)用 throw NullPointerException()
  2. 使用 !! 操作符
  3. 外部的 Java 代碼導(dǎo)致這個異常
  4. 初始化過程中存在某些數(shù)據(jù)不一致 (在構(gòu)造器中使用了未初始化的 this)

避免NPE

在Kotlin中,明確區(qū)分可以指向 null 的引用 (可為 null 引用) 與不可以指向null的引用 (非null引用). 比如, 一個通常的 String 類型變量不可以指向 null:

?
1
2
var a: String = "abc"
a = null // 編譯錯誤

此時,你對a變量的任何調(diào)用都是安全的,因為它為非null,你可以對該引用做任何操作而不會報NPE。就算對a賦值給Null,編譯器都會報錯,不會讓你通過。

可是,實際開發(fā)時,不可能所有的變量不會null,總會有情況,變量是null的,此時該如何設(shè)定該變量呢?要允許null值的變量, 我們可以將變量聲明為可為null的字符串, 寫作 String? :

?
1
2
var b: String? = "abc"
b = null // ok

這樣,我們是解決了變量可以設(shè)置為null的問題,可NPE的這個陷阱又設(shè)上了,如果再粗心大意,NPE又來找麻煩了。

如果我們?nèi)匀恍枰L問這個屬性, 對不對? 有以下幾種方法可以實現(xiàn):

在條件語句中進行null檢查

通過條件語句,對變量檢查是否為null,對 null 和非 null 的兩種情況分別處理:

?
1
2
3
4
if (b != null && b.length > 0)
  print("String of length ${b.length}")
else
  print("Empty string")

注:

該方案只是針對當前b的值,b的值在檢查以后,如果b的值被修改仍需對此值做非null檢查,也就是說每次修改b的值,都必須對b作非null驗證,這也導(dǎo)致了代碼的冗余。

安全調(diào)用

什么是安全調(diào)用?看起來有點不理解,既然是null怎么還會有安全呢?

?
1
b?.length

在Kotlin中,允許使用 “?.”操作符調(diào)用變量,其含義是如果b不是null,這個表達式將會返回b.length,否則返回 null.如果使用了”?.”,其表達式的值也應(yīng)為 可為null的,比如Int?,否則編譯器會報錯。

?
1
bob?.department?.head?.name

安全調(diào)用在鏈式調(diào)用的情況下非常有用.這樣的鏈式調(diào)用, 只要屬性鏈中任何一個屬性為 null, 整個表達式就會返回 null.

?:操作符

如果 ?: 左側(cè)的表達式值不是null, 就會返回表達式的的值,否則, 返回右側(cè)表達式的值.

?
1
val l = b?.length ?: -1

如果b不為null,將返回b的長度,如果為null,將返回-1

注:

只有在左側(cè)表達式值為 null 時, 才會計算右側(cè)表達式.

由于在 Kotlin 中 throw 和 return 都是表達式, 因此它們也可以用在 Elvis 操作符的右側(cè). 這種用法可以帶來很大的方便, 比如, 可以用來檢查函數(shù)參數(shù)值是否合法。

?
1
2
3
4
5
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:

?
1
val l = b!!.length()

當b為null時就拋出一個異常,你可以捕獲它,而不是在不知道在某一角落里調(diào)用時,才報出異常,抓頭撓腮半天,才找到NPE在哪里。

安全的類型轉(zhuǎn)換

如果對象不是我們期望的目標類型, 那么通常的類型轉(zhuǎn)換就會導(dǎo)致ClassCastException,可以選擇使用安全的類型轉(zhuǎn)換, 如果轉(zhuǎn)換不成功, 它將會返回 null,這樣避免了轉(zhuǎn)換異常的拋出。

?
1
val aInt: Int? = a as? Int

感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

原文鏈接:http://blog.csdn.net/io_field/article/details/53470628

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 日本中文一区二区 | 冥王星之恋泰剧在线观看 | 中文在线a在线 | 日韩成人av电影在线观看 | 日韩欧美一区二区三区久久婷婷 | 久久精品久久综合 | 国产一区二区三区免费视频 | 中文字幕亚洲精品 | 亚洲综合国产 | 日韩免费一级 | 国产亚洲精品久久久456 | 国产中文字幕网 | 精品国产欧美一区二区三区成人 | 欧美日韩在线播放 | 免费黄色大片 | 日韩精品一区二区三区四区五区 | 日本手机在线视频 | 国产中文字幕在线免费观看 | www日韩| 日本不卡免费新一二三区 | 日韩欧美视频在线 | 在线无码 | 日韩国产一区二区 | 久久综合久久久 | 日韩av手机版 | 三级在线观看网站 | 亚洲视频在线观看视频 | 99精品国产高清在线观看 | 久久精品成人免费视频 | 看亚洲a级一级毛片 | 亚洲免费人成在线视频观看 | 91av影院| 韩国精品一区二区 | 嫩草网址 | 国产精品久久久久久久久久新婚 | 婷婷成人在线 | 日本欧美在线 | 亚洲精品字幕 | 91视频大全 | 免费在线a | 久久久网页 |