Kotlin 空安全

前言

當(dāng)我們使用 Java 開發(fā)的時候盲链,如果不想遇到 NullPointerException队秩,我們就需要在使用它之前不停的判斷它是否為 null蓄愁,而 Kotlin 是空安全的掂恕,我們在編譯時期就處理了各種 null 的情況限煞,避免了執(zhí)行時異常庇绽。

空安全

// 不能通過編譯锡搜,Artist 不能是 null
var notNullArtist : Artist = null

// Artist 可以是 null
var artist: Artist? = null

// 無法編譯, artist可能是null癣猾,我們需要進(jìn)行處理
artist.print()

// 只要在artist != null時才會打印
artist?.print()

// 只有在確保artist不是null的情況下才能這么調(diào)用,否則它會拋出異常
artist!!.print()

// 使用Elvis操作符來給定一個在是null的情況下的替代值
val name = artist?.name ?: "empty"
1. 安全調(diào)用符 ?.

?. 會被編譯為一個三目運(yùn)算表達(dá)式余爆,如果 ?. 前的對象不為 null纷宇,則調(diào)用 ?. 后的方法或?qū)傩裕駝t返回 null蛾方。

2. Elvis 操作符 ?:

Elvis 操作符是三目條件運(yùn)算符的簡略寫法像捶,用于指出一個是 null 的情況下的替代值。

Kotlin 中可以用 Elvis 操作符配合安全調(diào)用符桩砰,實現(xiàn)簡單清晰的空檢查和空操作拓春。

轉(zhuǎn)化關(guān)系:

  • A ?: B 等價 if (A == null) B
  • A?.B ?: C等價 if (A != null) A.B else C

不建議廣泛使用!!操作符

Kotlin 不建議在代碼中廣泛使用 !! 操作符,這回浪費(fèi) Kotlin 設(shè)計良好的非空類型亚隅,每一個 !! 都意味著一個未處理的 NullPointerException 硼莽,讓 Kotlin 代碼充斥著 NPE

1. 用 val 而不是 var

在 Kotlin 中 val 代表只讀,var 代表可變煮纵。val 是線程安全的懂鸵,而且不需要擔(dān)心 null 的問題。

2. 使用lateinit

在 Android 定義一些成員變量的時候行疏,經(jīng)常需要在 onCreate 方法中初始化匆光,這個時候我們就用不了 val,針對這種情況酿联,Kotlin 提供了 lateinit 關(guān)鍵字终息,就和其表面意思一樣,“晚些初始化”贞让。

3. 使用 Elvis 操作符

指出一個 null 情況下的替代值周崭。

4. 使用 let 函數(shù)

let 函數(shù)定義就是,默認(rèn)當(dāng)前這個對象作為閉包的it參數(shù)喳张,可以 return 返回函數(shù)的執(zhí)行結(jié)果续镇。一般要與安全調(diào)用符配合使用:

private var msg: String? = null

fun main(args: Array<String>) {
    msg = "Kotlin from ysan"
    var a = msg?.let { sendMessage(it) }
}

fun sendMessage(message : String) {
    for (s in message) {
        println(s)
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市蹲姐,隨后出現(xiàn)的幾起案子磨取,更是在濱河造成了極大的恐慌,老刑警劉巖柴墩,帶你破解...
    沈念sama閱讀 216,324評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件忙厌,死亡現(xiàn)場離奇詭異,居然都是意外死亡江咳,警方通過查閱死者的電腦和手機(jī)逢净,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,356評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人爹土,你說我怎么就攤上這事甥雕。” “怎么了胀茵?”我有些...
    開封第一講書人閱讀 162,328評論 0 353
  • 文/不壞的土叔 我叫張陵社露,是天一觀的道長。 經(jīng)常有香客問我琼娘,道長峭弟,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,147評論 1 292
  • 正文 為了忘掉前任脱拼,我火速辦了婚禮瞒瘸,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘熄浓。我一直安慰自己情臭,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,160評論 6 388
  • 文/花漫 我一把揭開白布赌蔑。 她就那樣靜靜地躺著俯在,像睡著了一般。 火紅的嫁衣襯著肌膚如雪惯雳。 梳的紋絲不亂的頭發(fā)上朝巫,一...
    開封第一講書人閱讀 51,115評論 1 296
  • 那天鸿摇,我揣著相機(jī)與錄音石景,去河邊找鬼。 笑死拙吉,一個胖子當(dāng)著我的面吹牛潮孽,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播筷黔,決...
    沈念sama閱讀 40,025評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼往史,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了佛舱?” 一聲冷哼從身側(cè)響起椎例,我...
    開封第一講書人閱讀 38,867評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎请祖,沒想到半個月后订歪,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,307評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡肆捕,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,528評論 2 332
  • 正文 我和宋清朗相戀三年刷晋,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,688評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡眼虱,死狀恐怖喻奥,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情捏悬,我是刑警寧澤撞蚕,帶...
    沈念sama閱讀 35,409評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站过牙,受9級特大地震影響诈豌,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜抒和,卻給世界環(huán)境...
    茶點故事閱讀 41,001評論 3 325
  • 文/蒙蒙 一矫渔、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧摧莽,春花似錦庙洼、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,657評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至征懈,卻和暖如春石咬,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背卖哎。 一陣腳步聲響...
    開封第一講書人閱讀 32,811評論 1 268
  • 我被黑心中介騙來泰國打工鬼悠, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人亏娜。 一個月前我還...
    沈念sama閱讀 47,685評論 2 368
  • 正文 我出身青樓焕窝,卻偏偏與公主長得像,于是被迫代替她去往敵國和親维贺。 傳聞我的和親對象是個殘疾皇子它掂,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,573評論 2 353

推薦閱讀更多精彩內(nèi)容

  • 可空類型與非空類型 在 Kotlin 中,類型分為可空引用和非空引用溯泣。例如虐秋,String 類型的常規(guī)變量不能容納 ...
    李慶雪閱讀 3,721評論 0 3
  • 本文是在學(xué)習(xí)和使用kotlin時的一些總結(jié)與體會,一些代碼示例來自于網(wǎng)絡(luò)或Kotlin官方文檔垃沦,持續(xù)更新... 對...
    竹塵居士閱讀 3,281評論 0 8
  • 空安全 可空類型和非空類型 在 Kotlin 類型系統(tǒng)中可以為空和不可為空的引用是不同的客给。比如,普通的 Strin...
    小浩_w閱讀 271評論 0 0
  • 寫在開頭:本人打算開始寫一個Kotlin系列的教程栏尚,一是使自己記憶和理解的更加深刻起愈,二是可以分享給同樣想學(xué)習(xí)Kot...
    胡奚冰閱讀 857評論 2 4
  • 來簡書的第一天只恨,沒什么就單純的想練習(xí)一下自己的文筆!接下來打算每天記錄自己一天發(fā)生的小事情呀抬虽,希望能堅持下來官觅!
    Windky_Chang閱讀 141評論 0 1