Kotlin的空安全

背景
既然Google官方已經(jīng)宣布Kotlin為Android官方語言,我覺得炸枣,那就沒什么可爭議的律歼,作為Android開發(fā)者必須開始學(xué)習(xí)民镜,跟上節(jié)奏,相信不會很費力氣险毁。我學(xué)習(xí)的大部分知識來自Kotlin 學(xué)習(xí)之路制圈,這哥們寫得非常細心们童,真心贊。

Kotlin如何減少空指針異常
首先科普一下什么情況會導(dǎo)致NPE(空指針異常):

String str; //聲明變量
//str="Hello Word"; //沒有初始化變量
str.hashCode(); //報NPE

Kotlin 解決空安全鲸鹦,不是消滅 NPE慧库,而是 允許 NPE 存在,但只會在它該出現(xiàn)的地方出現(xiàn) 馋嗜。

可空類型與非空類型
所有數(shù)據(jù)類型默認都是非空(non-null)的齐板,如果想把 null 賦給它們的對象,需要在類型后加上 ? 葛菇,聲明為可空類型覆积。Kotlin 這樣設(shè)計有什么好處呢?我們只要將變量聲明為非空類型熟呛,就可以放心地調(diào)用它的實例方法和實例變量,不用擔心出現(xiàn) NPE尉姨。

val str:String="Hello World"; //不可空類型 
val str:String?=null; //可空類型

如何安全地調(diào)用可空類型變量的方法
上面講到我們可以放心地調(diào)用非空類型變量的方法庵朝,可對于可空類型呢?要用到以下方法:

val str:String?=null; //可空類型
//str="Hello World";
str.?hashCode();

如果 ?. 前的對象不為 null又厉,則調(diào)用 ?. 后的方法或?qū)傩跃鸥駝t返回 null。

Elvis 操作符 ?:
比如這段 Java 代碼:

File[] files = new File("C:\\Documents").listFiles();
System.out.println((files != null) ? files.length : "Empty");

如果 files 數(shù)組為 null覆致,則打印 "Empty"侄旬,如果不為 null,則打印數(shù)組的長度煌妈。
用 Kotlin 寫是這樣的:

val files = File("C:\\Documents").listFiles()
println(files?.size ?: "Empty")

可以這樣理解 Kotlin 里的 Elvis 操作符:
A ?: B 等價于 if(A == null) B
A?.B ?: C 等價于 if(A != null) A.B else C

let 函數(shù)
Java寫法:

File[] files = (new File("C:\\Documents")).listFiles();
if(files != null) {
  for(int i = 0; i < files.length; i++) {
    File file = files[i];
    System.out.println(file.getName());
  }
}

Kotlin寫法:

val files = File("C:\\Documents").listFiles() 
// files 的類型自動推斷為 Array<File>?
files?.let {
  for (file in files) 
    println(file.name)
}

相比上面的.?儡羔,這個?.let只是多了個括號。

非空操作符 !!
Kotlin寫法:

val files = File("C:\\Documents").listFiles()!! // files 的類型自動推斷為 Array<File>
for(file in files)
    println(file.name)

Java寫法:

File[] var1 = (new File("C:\\Documents")).listFiles();
if(var1 == null)
  Intrinsics.throwNpe(); // 拋出 NPE
File[] files = var1;

也就是說加了!!的地方璧诵,如果為null汰蜘,則會報NPE,所以說Kotlin還是存在空指針異常的之宿,只不過Kotlin官方不建議代碼中有太多的!!族操,否則就浪費了Kotlin設(shè)計良好的非空類型。

總結(jié)
我把一個用Java寫的項目全改成Kotlin了比被,發(fā)覺原來的項目里存在太多會出現(xiàn)NPE的地方色难,而這些地方往往在我們寫代碼、測試時是無法發(fā)現(xiàn)的等缀,只有在生產(chǎn)環(huán)境下枷莉,看后臺的log才發(fā)現(xiàn)這些問題,所以Kotlin這個設(shè)計還是非常棒的项滑!
寫著寫著依沮,心里有些糾結(jié)涯贞,本著自己消化總結(jié)后寫一篇通俗易懂的,可是后來發(fā)現(xiàn)原文寫得太好了危喉,糾結(jié)糾結(jié)宋渔,再次感謝作者,附上原文鏈接吧辜限!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末皇拣,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子薄嫡,更是在濱河造成了極大的恐慌氧急,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件毫深,死亡現(xiàn)場離奇詭異吩坝,居然都是意外死亡,警方通過查閱死者的電腦和手機哑蔫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進店門钉寝,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人闸迷,你說我怎么就攤上這事嵌纲。” “怎么了腥沽?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵逮走,是天一觀的道長。 經(jīng)常有香客問我今阳,道長师溅,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任酣栈,我火速辦了婚禮险胰,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘矿筝。我一直安慰自己起便,他們只是感情好,可當我...
    茶點故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布窖维。 她就那樣靜靜地躺著榆综,像睡著了一般。 火紅的嫁衣襯著肌膚如雪铸史。 梳的紋絲不亂的頭發(fā)上鼻疮,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天,我揣著相機與錄音琳轿,去河邊找鬼判沟。 笑死耿芹,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的挪哄。 我是一名探鬼主播吧秕,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼迹炼!你這毒婦竟也來了砸彬?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤斯入,失蹤者是張志新(化名)和其女友劉穎砂碉,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體刻两,經(jīng)...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡增蹭,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了磅摹。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片沪铭。...
    茶點故事閱讀 38,064評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖偏瓤,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情椰憋,我是刑警寧澤厅克,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站橙依,受9級特大地震影響证舟,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜窗骑,卻給世界環(huán)境...
    茶點故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一女责、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧创译,春花似錦抵知、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至立砸,卻和暖如春掖疮,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背颗祝。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工浊闪, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留恼布,地道東北人。 一個月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓搁宾,卻偏偏與公主長得像折汞,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子猛铅,可洞房花燭夜當晚...
    茶點故事閱讀 42,802評論 2 345

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