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

詳解Kotlin的空指針處理

 更新時(shí)間:2017年06月30日 09:50:58   作者:還不走  
這篇文章主要介紹了詳解Kotlin的空指針處理的相關(guān)資料,需要的朋友可以參考下

詳解Kotlin的空指針處理

Kotlin的空指針處理相比于java有著極大的提高,可以說(shuō)是不用擔(dān)心出現(xiàn)NullPointerException的錯(cuò)誤,kotlin對(duì)于對(duì)象為null的情況有嚴(yán)格的界定,編碼的階段就需要用代碼表明引用是否可以為null,為null的情況需要強(qiáng)制性的判斷處理。

咋看一下這些在java里面其實(shí)也有,問(wèn)題是一般開(kāi)發(fā)中不寫(xiě)也是可以的(大部分開(kāi)發(fā)不會(huì)花很多時(shí)間考慮這些),等出了空指針錯(cuò)誤再一個(gè)個(gè)打補(bǔ)丁。這樣往往會(huì)遺漏很多空指針,后期的解決僅僅是做一個(gè)if判斷,沒(méi)有從根源解決問(wèn)題

變量需要知道是否可以為null

第一個(gè)與java的不同,kotlin聲明引用時(shí)不可以直接賦值為null

var helloA: String=null //編譯器直接報(bào)錯(cuò) null can not be value of a non null type string

這里插一句,kotlin的成員變量(全局變量)必須要初始化甚至是基本數(shù)據(jù)類(lèi)型都要手動(dòng)給一個(gè)初始值,局部變量可以不用初始化,上面的例子是成員變量的聲明。

編譯器直接表示hello是一個(gè)non null type你不可以直接賦一個(gè)null值。對(duì)于我們java原住民來(lái)說(shuō)聲明變量時(shí)如果不去賦值,編譯器會(huì)默認(rèn)賦null(除去基本數(shù)據(jù)類(lèi)型),在kotlin這是不允許的。

類(lèi)型?

當(dāng)某個(gè)變量的值可以為 null 的時(shí)候,必須在聲明處的類(lèi)型后添加 ? 來(lái)標(biāo)識(shí)該引用可為空。

這是官方文檔的說(shuō)明,也就是說(shuō)上面的變量聲明只需要在String類(lèi)型后面加一個(gè)?就可以解決這個(gè)錯(cuò)誤。

var helloB : String? = null

如果不用?也可以直接初始化來(lái)解決問(wèn)題

var helloA : String = "hello"

String和String?

helloA 和 helloB2個(gè)變量的類(lèi)型分別為String和String?,這2種類(lèi)型的區(qū)別在于引用時(shí)是否空安全,String?代表可能為空,引用不安全,String代表不會(huì)為空,引用安全。比如調(diào)用一下helloB的方法


可以看到有些方法是灰的代表不能直接調(diào)用,有些是白的代表可以直接調(diào)用,為什么可以直接調(diào)用后面再講

helloB.length //Only safe (?.) or non-null asserted (!!.) calls are allowed on a nullable receiver of type String?
這里的錯(cuò)誤解釋簡(jiǎn)單的理解就是helloB是一個(gè)可能為空的類(lèi)型(String?),對(duì)于可空類(lèi)型你必須做判空的處理才能調(diào)用方法。有沒(méi)有愛(ài)上kotlin? wtf太厲害了

如何做判空處理

最簡(jiǎn)單的方法就是使用?.來(lái)調(diào)用方法。這個(gè)符號(hào)的意義是,當(dāng)helloB不為空調(diào)用.length方法,返回Int值,如果helloB為空則返回null。

helloB?.length

注意這里的返回值類(lèi)型為Int? 依然是可以為空的類(lèi)型

不推薦的寫(xiě)法!!這個(gè)操作符可以說(shuō)是為了空指針錯(cuò)誤愛(ài)好者準(zhǔn)備的,使用了!!操作符代表你不關(guān)心變量的空判斷可以報(bào)出NullPointerException,又或者你有絕對(duì)的自信這里肯定不為空,可以放心的調(diào)用,可以說(shuō)!!放棄了判空的檢查

helloB!!.length

Elvis 操作符?:

回到?.的調(diào)用上來(lái),這個(gè)調(diào)用方式存在一個(gè)讓人不安的處理,就是在變量為null的情況下,會(huì)直接返回null,這樣空指針的隱患還在。

var l : Int = helloB?.length //報(bào)錯(cuò)類(lèi)型不匹配 Int? 和 Int

修正的話需要通過(guò)if判斷來(lái)進(jìn)行判空處理

var l: Int = if (helloB?.length != null) helloB.length else -1

這種寫(xiě)法可以簡(jiǎn)化成Elvis 操作符?:

var le: Int = helloB?.length ?: 0

當(dāng)?:左邊非空返回左邊的值,左邊為空則返回右邊的值

最后前文提到的當(dāng)helloB為空時(shí)有些方法仍然可以調(diào)用比如equals方法

helloB.equals(helloA)

即使helloB為可空類(lèi)型依然可以調(diào)用equals方法,但是這里的equals方法并不是String.java的equals方法,而是StringJvm.kt中的equals方法

public fun String?.equals(other: String?, ignoreCase: Boolean = false): Boolean {
  if (this === null)
    return other === null
  return if (!ignoreCase)
    (this as java.lang.String).equals(other)
  else
    (this as java.lang.String).equalsIgnoreCase(other)
}

關(guān)鍵代碼

this===null
return other === null

這個(gè)方法對(duì)變量本身為null的情況已經(jīng)做了判斷,同時(shí)方法寫(xiě)成了String?.equals可以讓String?類(lèi)型的對(duì)象直接調(diào)用這個(gè)equals方法

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

相關(guān)文章

  • Java連接數(shù)據(jù)庫(kù)步驟解析(Oracle、MySQL)

    Java連接數(shù)據(jù)庫(kù)步驟解析(Oracle、MySQL)

    本文主要介紹了Java連接Oracle數(shù)據(jù)庫(kù)和MySQL數(shù)據(jù)庫(kù)的步驟解析。具有很好的參考價(jià)值,需要的朋友一起來(lái)看下吧
    2016-12-12
  • Jtable和JTree的寫(xiě)法示例代碼

    Jtable和JTree的寫(xiě)法示例代碼

    這篇文章主要介紹了Jtable和JTree的基本概念,常用構(gòu)造方法,以及二者的通用寫(xiě)法,需要的朋友可以了解下。
    2017-09-09
  • Maven設(shè)置JDK版本的兩種方法實(shí)現(xiàn)

    Maven設(shè)置JDK版本的兩種方法實(shí)現(xiàn)

    本文主要介紹了Maven設(shè)置JDK版本的兩種方法實(shí)現(xiàn),是通過(guò)Apache Maven Compiler Plugin插件實(shí)現(xiàn)的,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-07-07
  • Java同步代碼塊和同步方法原理與應(yīng)用案例詳解

    Java同步代碼塊和同步方法原理與應(yīng)用案例詳解

    這篇文章主要介紹了Java同步代碼塊和同步方法原理與應(yīng)用,結(jié)合具體案例形式分析了使用java同步代碼塊和同步方法實(shí)現(xiàn)買(mǎi)票功能的相關(guān)原理與操作技巧,需要的朋友可以參考下
    2019-10-10
  • JavaWeb 網(wǎng)上書(shū)店 注冊(cè)和登陸功能案例詳解

    JavaWeb 網(wǎng)上書(shū)店 注冊(cè)和登陸功能案例詳解

    這篇文章主要介紹了JavaWeb 網(wǎng)上書(shū)店 注冊(cè)和登陸功能,結(jié)合具體案例形式詳細(xì)分析了JavaWeb 網(wǎng)上書(shū)店 注冊(cè)和登陸功能具體實(shí)現(xiàn)步驟、操作技巧與注意事項(xiàng),需要的朋友可以參考下
    2019-08-08
  • Maven工程打包jar的多種方式

    Maven工程打包jar的多種方式

    Maven打包一般可以生成兩種包一種是可以直接運(yùn)行的包,一種是依賴(lài)包(只是編譯包),這篇文章主要介紹了Maven工程打包jar的多種方式步驟詳解,需要的朋友可以參考下
    2023-04-04
  • Java Swing中的文本區(qū)(JTextArea)實(shí)現(xiàn)換行保存到文件的幾個(gè)方法

    Java Swing中的文本區(qū)(JTextArea)實(shí)現(xiàn)換行保存到文件的幾個(gè)方法

    這篇文章主要介紹了Java Swing中的文本區(qū)(JTextArea)實(shí)現(xiàn)換行保存到文件的幾個(gè)方法,本文給出了4種方法,需要的朋友可以參考下
    2014-10-10
  • springboot中的starter使用解析

    springboot中的starter使用解析

    這篇文章主要介紹了springboot中的starter使用解析,引入了starter依賴(lài)之后,基礎(chǔ)組件就可以像在spring的bean一樣在項(xiàng)目中使用,那其實(shí)只要找到在哪里加載了這些bean就明白了,需要的朋友可以參考下
    2023-10-10
  • springboot 集成支付寶支付的示例代碼

    springboot 集成支付寶支付的示例代碼

    這篇文章主要介紹了springboot 集成支付寶支付的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-06-06
  • MyBatis實(shí)現(xiàn)樂(lè)觀鎖和悲觀鎖的示例代碼

    MyBatis實(shí)現(xiàn)樂(lè)觀鎖和悲觀鎖的示例代碼

    在數(shù)據(jù)庫(kù)操作中,樂(lè)觀鎖和悲觀鎖是兩種常見(jiàn)的并發(fā)控制策略,本文主要介紹了MyBatis實(shí)現(xiàn)樂(lè)觀鎖和悲觀鎖的示例代碼,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-07-07

最新評(píng)論