兩句話:
1、語法上,要求不能null的,如果編譯時能發(fā)現(xiàn)違反了不能null的約定。則編譯不通過。
總有變量,編譯時,是不能夠知道是不是為空。這個時候還是要進行空判斷。
2、對于這個空判斷。kotlin的語法糖提供了簡易的判斷方法;(來實現(xiàn)所謂的空安全)
a、!!如果是空就nullpointexception(懶惰,沒有默認(rèn)值)
b、?如果是null,返回默認(rèn)值,而不是exception。(就空安全了())??
c、varString?.length()?:-1 類似上面的情況,不過將返回的null修改為一個默認(rèn)值。
友情連接:友情連接
這篇文章說的比較合理:盡可能避免NPE,沒有辦法消除
空安全符號:
非null 申明:String
可null 聲明: String?
可 null 調(diào)用:varName?.length()? null 時返回null
可null 調(diào)用:如果varName?.length()?:-1 與上面一個不同的是,返回一個默認(rèn)值而不是null
保證不null:調(diào)用:varName!!.length()? 如果保證失敗,就NPE
類型安全轉(zhuǎn)換:
避免ClassCastException,
val aInt: Int? = a as? Int? 如果失敗,返回null而不是?ClassCastException
總結(jié)來說:
Kotlin要求:對于一個變量,要么你很自信,保證不為null;要么要把null的不確定性申明出來。二者必取其一。
對于一個變量,你要以保證不空的語法描述;(String , stringVar.length)
????????那么如果還是出現(xiàn)了空:
? ? ? ? ? ?1、 編譯時不通過,盡早發(fā)現(xiàn)是好事;
? ? ? ? ? ? 2、運行時:不好意思,還是會NPE。
如果你不能保證不為Null 那么要把這個不確定性,以語法的形式顯示說明。
kotlin知道后會盡可能的幫你保證null安全。
如果不告訴kotlin這種不確定性,不好意思。Kotlin幫不了你。
轉(zhuǎn)向上面??那種情況。kotlin會以為你很自信,不為null。
? ? ? ?1、 申明:String? 調(diào)用 varString?.? 如果null那么返回null而不是NPE
? ? ? ?2、 以上情況的增強版:如果null,那么返回一個默認(rèn)值,而不是null
? ? ? ?3、最后,一個nullAble的變量,你卻很自信。好:那就varString!!.length()??如果是你自信過頭了。不好意思。還是NPE
技巧:
我們的首要、主要精力應(yīng)該花費在變量聲明時:決定是否絕不null,或者無法確定是否null
如果你申明為,無法確定是否null,那么剩下的交由kotlin,它會盡力幫助你。
只要你不是過分自信,結(jié)果自信過頭(申明了一個會null的變量為String ;一個可null的變量varString!!.length())
NPE就不會那么容易出現(xiàn)了。