最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Kotlin null的處理詳解

 更新時(shí)間:2017年06月05日 11:17:08   作者:行云間  
這篇文章主要介紹了Kotlin null的處理詳解的相關(guān)資料,需要的朋友可以參考下

Kotlin null的處理詳解

NullPointerException,俗稱NPE,不管菜鳥還是老鳥們,都是不可避免,經(jīng)常遇到的一個(gè)異常,解釋起來很簡單,就“空指針”三個(gè)字??偸窃谝淮尾恍⌒模暨M(jìn)這個(gè)陷阱里。Kotlin 的設(shè)計(jì)目標(biāo)就是希望消除代碼中 null 引用帶來的危險(xiǎn), 也就是所謂的造成十億美元損失的大錯(cuò)誤.

NPE的原因

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

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

避免NPE

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

var a: String = "abc"
a = null // 編譯錯(cuò)誤

此時(shí),你對(duì)a變量的任何調(diào)用都是安全的,因?yàn)樗鼮榉莕ull,你可以對(duì)該引用做任何操作而不會(huì)報(bào)NPE。就算對(duì)a賦值給Null,編譯器都會(huì)報(bào)錯(cuò),不會(huì)讓你通過。

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

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

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

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

在條件語句中進(jìn)行null檢查

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

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

注:

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

安全調(diào)用

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

b?.length

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

bob?.department?.head?.name

安全調(diào)用在鏈?zhǔn)秸{(diào)用的情況下非常有用.這樣的鏈?zhǔn)秸{(diào)用, 只要屬性鏈中任何一個(gè)屬性為 null, 整個(gè)表達(dá)式就會(huì)返回 null.

?:操作符

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

val l = b?.length ?: -1

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

注:

只有在左側(cè)表達(dá)式值為 null 時(shí), 才會(huì)計(jì)算右側(cè)表達(dá)式.

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

fun foo(node: Node): String? { 
val parent = node.getParent() ?: return null 
val name = node.getName() ?: throw IllegalArgumentException(“name expected”) 
// … 
} 

!! 操作符

對(duì)于b不為null的情況, 這個(gè)表達(dá)式將會(huì)返回這個(gè)非null值(比如, 在我們的例子中就是一個(gè) String 類型值), 如果b是 null, 這個(gè)表達(dá)式就

會(huì)拋出一個(gè) NPE:

val l = b!!.length()

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

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

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

val aInt: Int? = a as? Int

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

您可能感興趣的文章:

相關(guān)文章

  • Java實(shí)現(xiàn)markdown格式內(nèi)容轉(zhuǎn)換為word

    Java實(shí)現(xiàn)markdown格式內(nèi)容轉(zhuǎn)換為word

    這篇文章主要為大家簡單介紹了如何利用Java實(shí)現(xiàn)markdown格式內(nèi)容轉(zhuǎn)換為word文檔,文中的示例代碼簡潔易懂,有需要的小伙伴可以參考一下
    2025-03-03
  • springcloud項(xiàng)目占用內(nèi)存好幾個(gè)G導(dǎo)致服務(wù)器崩潰的問題

    springcloud項(xiàng)目占用內(nèi)存好幾個(gè)G導(dǎo)致服務(wù)器崩潰的問題

    這篇文章主要介紹了springcloud項(xiàng)目占用內(nèi)存好幾個(gè)G導(dǎo)致服務(wù)器崩潰的問題,本文給大家分享解決方案供大家參考,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-10-10
  • java 數(shù)據(jù)結(jié)構(gòu)單鏈表的實(shí)現(xiàn)

    java 數(shù)據(jù)結(jié)構(gòu)單鏈表的實(shí)現(xiàn)

    這篇文章主要介紹了java 數(shù)據(jù)結(jié)構(gòu)單鏈表的實(shí)現(xiàn)的相關(guān)資料,需要的朋友可以參考下
    2017-07-07
  • 詳解java8中的Stream數(shù)據(jù)流

    詳解java8中的Stream數(shù)據(jù)流

    Stream使用一種類似用SQL語句從數(shù)據(jù)庫查詢數(shù)據(jù)的直觀方式來提供一種對(duì)Java集合運(yùn)算和表達(dá)的高階抽象。接下來通過本文給大家分享java8中的Stream數(shù)據(jù)流知識(shí),感興趣的朋友一起看看吧
    2017-10-10
  • Java學(xué)習(xí)之局部變量、成員變量舉例詳解

    Java學(xué)習(xí)之局部變量、成員變量舉例詳解

    這篇文章主要介紹了Java中的成員變量和局部變量,包括它們的定義、特點(diǎn)、初始化、作用域和生命周期等,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2025-02-02
  • MyBatis傳入?yún)?shù)為List對(duì)象的實(shí)現(xiàn)

    MyBatis傳入?yún)?shù)為List對(duì)象的實(shí)現(xiàn)

    這篇文章主要介紹了MyBatis傳入?yún)?shù)為List對(duì)象的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • SpringBoot+Redis實(shí)現(xiàn)消息的發(fā)布與訂閱的示例代碼

    SpringBoot+Redis實(shí)現(xiàn)消息的發(fā)布與訂閱的示例代碼

    本文主要介紹了SpringBoot+Redis實(shí)現(xiàn)消息的發(fā)布與訂閱,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04
  • SpringBoot在生產(chǎn)快速禁用Swagger2的方法步驟

    SpringBoot在生產(chǎn)快速禁用Swagger2的方法步驟

    這篇文章主要介紹了SpringBoot在生產(chǎn)快速禁用Swagger2的方法步驟,使用注解關(guān)閉Swagger2,避免接口重復(fù)暴露,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2018-12-12
  • java實(shí)現(xiàn)象棋小游戲

    java實(shí)現(xiàn)象棋小游戲

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)象棋小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-01-01
  • Spring的Bean生命周期之BeanDefinition詳解

    Spring的Bean生命周期之BeanDefinition詳解

    這篇文章主要介紹了Spring的Bean生命周期之BeanDefinition詳解,在spring bean創(chuàng)建過程 依賴 BeanDefinition 中的信息處理bean的生產(chǎn),BeanDefinition 是 Spring Framework 中定義 Bean 的配置元信息接口,需要的朋友可以參考下
    2023-12-12

最新評(píng)論

牟定县| 德令哈市| 武邑县| 阿拉善右旗| 乌什县| 灵丘县| 全州县| 陈巴尔虎旗| 尚义县| 亚东县| 富裕县| 宜宾县| 萨迦县| 英吉沙县| 依安县| 沧州市| 云龙县| 宣恩县| 遵义市| 天峨县| 临湘市| 陇南市| 遵义县| 安溪县| 穆棱市| 吉木萨尔县| 开原市| 玉屏| 和田市| 泸州市| 泰和县| 深泽县| 龙川县| 秦皇岛市| 威海市| 文安县| 邵东县| 富民县| 黎城县| 上饶县| 三亚市|