欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Kotlin null的處理詳解

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

Kotlin null的處理詳解

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

NPE的原因

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

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

避免NPE

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

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

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

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

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

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

如果我們仍然需要訪問這個屬性, 對不對? 有以下幾種方法可以實現(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驗證,這也導致了代碼的冗余。

安全調用

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

b?.length

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

bob?.department?.head?.name

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

?:操作符

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

val l = b?.length ?: -1

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

注:

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

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

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時就拋出一個異常,你可以捕獲它,而不是在不知道在某一角落里調用時,才報出異常,抓頭撓腮半天,才找到NPE在哪里。

安全的類型轉換

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

val aInt: Int? = a as? Int

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

您可能感興趣的文章:

相關文章

  • JVM的類加載器和雙親委派模式你了解嗎

    JVM的類加載器和雙親委派模式你了解嗎

    這篇文章主要為大家詳細介紹了JVM類加載器和雙親委派模式,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • java中Map接口常用的方法解讀

    java中Map接口常用的方法解讀

    這篇文章主要介紹了java中Map接口常用的方法解讀,Map接口是雙列集合,它的每一個元素都包含一個鍵對象key和值對象Value,鍵和值對象之間存在一種對應關系,稱為映射,需要的朋友可以參考下
    2024-01-01
  • 深入學習MyBatis中的參數(推薦)

    深入學習MyBatis中的參數(推薦)

    大家日常使用MyBatis經常會遇到一些異常,想要避免參數引起的錯誤,我們需要深入了解參數。想了解參數,我們首先看MyBatis處理參數和使用參數的全部過程。下面這篇文章主要給大家介紹了MyBatis中參數的的相關資料,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-06-06
  • Java包機制及javadoc詳解

    Java包機制及javadoc詳解

    為了更好地組織類,Java提供了包機制,用于區(qū)別類名的命名空間,一般利用公司域名倒置作為包名,這篇文章主要介紹了Java包機制以及javadoc,需要的朋友可以參考下
    2022-10-10
  • SpringBoot2 整合FreeMarker實現(xiàn)頁面靜態(tài)化示例詳解

    SpringBoot2 整合FreeMarker實現(xiàn)頁面靜態(tài)化示例詳解

    這篇文章主要介紹了SpringBoot2 整合FreeMarker實現(xiàn)頁面靜態(tài)化示例詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-07-07
  • MybatisPlus中插入數據后獲取該對象主鍵值的實現(xiàn)

    MybatisPlus中插入數據后獲取該對象主鍵值的實現(xiàn)

    這篇文章主要介紹了MybatisPlus中插入數據后獲取該對象主鍵值,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-09-09
  • Java object wait notify notifyAll代碼解析

    Java object wait notify notifyAll代碼解析

    這篇文章主要介紹了Java object wait notify notifyAll代碼解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-11-11
  • Spring boot實現(xiàn)熱部署的兩種方式詳解

    Spring boot實現(xiàn)熱部署的兩種方式詳解

    這篇文章主要介紹了Spring boot實現(xiàn)熱部署的兩種方式,這兩種方法分別是使用 Spring Loaded和使用spring-boot-devtools進行熱部署,文中給出了詳細示例代碼和介紹,需要的朋友可以參考學習,下面來一起看看吧。
    2017-04-04
  • java 多線程實現(xiàn)在線咨詢(udp)

    java 多線程實現(xiàn)在線咨詢(udp)

    這篇文章主要介紹了java 多線程實現(xiàn)在線咨詢(udp)的示例,幫助大家更好的理解和學習Java 網絡編程的相關內容,感興趣的朋友可以了解下
    2020-11-11
  • Java項目導出數據為 PDF 文件的操作代碼

    Java項目導出數據為 PDF 文件的操作代碼

    一個小需求,需要將頁面上的數據導出為PDF,正常情況下這個需求需要讓前端來做,但是現(xiàn)在上面讓咱們后端來做,也沒問題,這篇文章主要介紹了Java項目導出數據為 PDF 文件的操作代碼,需要的朋友可以參考下
    2022-12-12

最新評論