Kotlin學(xué)習(xí)手冊(cè)(九)空類(lèi)型安全

如需轉(zhuǎn)載請(qǐng)?jiān)u論或簡(jiǎn)信斋枢,并注明出處,未經(jīng)允許不得轉(zhuǎn)載

Kotlin系列導(dǎo)讀

Kotlin學(xué)習(xí)手冊(cè)(一)類(lèi)與繼承
Kotlin學(xué)習(xí)手冊(cè)(二)屬性與字段
Kotlin學(xué)習(xí)手冊(cè)(三)接口
Kotlin學(xué)習(xí)手冊(cè)(四)內(nèi)部類(lèi)
Kotlin學(xué)習(xí)手冊(cè)(五)函數(shù)
Kotlin學(xué)習(xí)手冊(cè)(六)數(shù)組與集合
Kotlin學(xué)習(xí)手冊(cè)(七)for循環(huán)
Kotlin學(xué)習(xí)手冊(cè)(八)內(nèi)聯(lián)函數(shù)let蟹演、with酒请、run囤萤、apply富雅、also
Kotlin學(xué)習(xí)手冊(cè)(九)空類(lèi)型安全
Kotlin學(xué)習(xí)手冊(cè)(十)帶你真正理解什么是Kotlin協(xié)程

目錄

前言

Kotlin 的類(lèi)型系統(tǒng)旨在消除來(lái)自代碼空引用的危險(xiǎn),也稱為《十億美元的錯(cuò)誤》

在Kotlin中痹屹,“空”也是一種類(lèi)型,將空指針問(wèn)題在編譯期間就拋出來(lái)嘲恍,而不是等到運(yùn)行時(shí)才發(fā)現(xiàn)淹辞。如StringString?是可以看做是兩種不同的類(lèi)型爷速,下面我們會(huì)詳細(xì)進(jìn)行介紹

空類(lèi)型

  • 非空類(lèi)型

聲明了非空類(lèi)型(如String)的變量莉给,不能容納 null

var a: String = "abc"
a = null // 編譯錯(cuò)誤
var a: String = null // 編譯錯(cuò)誤
  • 空類(lèi)型

如果一個(gè)變量想要容納空類(lèi)型颓遏,那么就需要用空類(lèi)型進(jìn)行聲明(如String?

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

空安全調(diào)用

  • 非空類(lèi)型

像在java中一樣進(jìn)行安全調(diào)用

val a = "Kotlin"
println(a.length) // 無(wú)需安全調(diào)用
  • 空類(lèi)型

需要通過(guò)?.進(jìn)行調(diào)用滤灯,不然無(wú)法通過(guò)編譯鳞骤,b?.length表示如果b為空,那么這段語(yǔ)句將不會(huì)執(zhí)行

val b: String? = null
println(b?.length)

kotlin還支持鏈?zhǔn)秸{(diào)用黍判,只要鏈上有一個(gè)值為空弟孟,那么將不會(huì)往下執(zhí)行。鏈?zhǔn)秸{(diào)用其實(shí)就是對(duì)java中的層層判空的一種代碼結(jié)構(gòu)優(yōu)化

bob?.department?.head?.name

Elvis操作符

有一段if-else表達(dá)式

val l: Int = if (b != null) b.length else -1

通過(guò)Elvis操作符可以將上面的代碼進(jìn)行簡(jiǎn)化样悟,寫(xiě)作?:

如果 ?: 左側(cè)表達(dá)式非空,返回左側(cè)表達(dá)式庭猩,否則返回右側(cè)表達(dá)式

val l = b?.length ?: -1

還可以搭配returnthrow使用

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

非空斷言

當(dāng)你認(rèn)為你所使用的對(duì)象肯定不為空的時(shí)候窟她,你可以使用!!來(lái)進(jìn)行非空斷言,這也能繞過(guò)編譯器的空類(lèi)型檢查蔼水。除非你完全清楚你為什么要使用它震糖,不然非常不推薦使用非空斷言。因?yàn)槿绻娴某霈F(xiàn)了null的情況趴腋,那就會(huì)造成一個(gè)Null Point Exception

val a = b!!.length

安全轉(zhuǎn)換

普通的轉(zhuǎn)換可能產(chǎn)生 ClassCastException 異常吊说。使用as?操作符嘗試轉(zhuǎn)換成指定類(lèi)型,如果轉(zhuǎn)換不成功則返回 null

fun main() {
    var a = "abc"   
    var b: Int ? = a as? Int
    println(b)  // 輸出 null
}

過(guò)濾可空集合

使用filterNotNull操作符优炬,過(guò)濾一個(gè)可空類(lèi)型元素集合中的非空元素

fun main() {    
    val nullableList: List<Int?> = listOf(1, 2, null, 4)
    val intList: List<Int> = nullableList.filterNotNull()
    println(intList)  // 輸出 [1, 2, 4]
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
禁止轉(zhuǎn)載颁井,如需轉(zhuǎn)載請(qǐng)通過(guò)簡(jiǎn)信或評(píng)論聯(lián)系作者。
  • 序言:七十年代末蠢护,一起剝皮案震驚了整個(gè)濱河市雅宾,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌葵硕,老刑警劉巖眉抬,帶你破解...
    沈念sama閱讀 216,496評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異懈凹,居然都是意外死亡蜀变,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)介评,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)库北,“玉大人,你說(shuō)我怎么就攤上這事∠凸撸” “怎么了洼专?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,632評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)孵构。 經(jīng)常有香客問(wèn)我屁商,道長(zhǎng),這世上最難降的妖魔是什么颈墅? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,180評(píng)論 1 292
  • 正文 為了忘掉前任蜡镶,我火速辦了婚禮,結(jié)果婚禮上恤筛,老公的妹妹穿的比我還像新娘官还。我一直安慰自己,他們只是感情好毒坛,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,198評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布望伦。 她就那樣靜靜地躺著,像睡著了一般煎殷。 火紅的嫁衣襯著肌膚如雪屯伞。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,165評(píng)論 1 299
  • 那天豪直,我揣著相機(jī)與錄音劣摇,去河邊找鬼。 笑死弓乙,一個(gè)胖子當(dāng)著我的面吹牛末融,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播暇韧,決...
    沈念sama閱讀 40,052評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼勾习,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了懈玻?” 一聲冷哼從身側(cè)響起语卤,我...
    開(kāi)封第一講書(shū)人閱讀 38,910評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎酪刀,沒(méi)想到半個(gè)月后粹舵,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,324評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡骂倘,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,542評(píng)論 2 332
  • 正文 我和宋清朗相戀三年眼滤,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片历涝。...
    茶點(diǎn)故事閱讀 39,711評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡诅需,死狀恐怖漾唉,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情堰塌,我是刑警寧澤赵刑,帶...
    沈念sama閱讀 35,424評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站场刑,受9級(jí)特大地震影響般此,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜牵现,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,017評(píng)論 3 326
  • 文/蒙蒙 一铐懊、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧瞎疼,春花似錦科乎、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,668評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至太抓,卻和暖如春空闲,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背腻异。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,823評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留这揣,地道東北人悔常。 一個(gè)月前我還...
    沈念sama閱讀 47,722評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像给赞,于是被迫代替她去往敵國(guó)和親机打。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,611評(píng)論 2 353