?. 安全調用運算符
foo?bar
if (foo != null){
return foo.bar()
}else{
return null
}
fun lengthOfStr(s:String?):Int = s.length //不能直接調用length方法
//如果增加了null檢查以後,就可以直接調用s.length了,如下:
fun lengthOfStr(s:String?):Int = if(s!=null) s.length else 0
//但是如果每個可空類型都這樣檢查會顯得特別累贅,此時就用到了安全調用運算符?.
s?.length 就相當於 if(s!=null) s.length else null
//如果s不爲空就執行方法,如果爲空就返回null
?: Elvis運算符(null合併運算符)
//簡單來說就是:
a?:b就是
if(a == null ){
return a
} esle{
return b
}
fun foo(s:String?){
val t:String = s ?: "" //如果?:左邊的值不爲空返回左邊的值,如果爲空返回""
}
//可以這樣使用
name ?: "UnKnown" //如果?:左邊爲空則返回"UnKnown"
//和throw運算符同時使用
//如果不爲空就返回name,如果爲空就拋出一個有意義的錯誤,而不是NullPointException
val name = name ?: throw illegalargumentexception("UnKnown name")//如果name爲空就會報自定義的異常
as? 安全轉換運算符
foo as? Type -> foo is Type retrun (foo as Type)
-> foo !is Type return null
非空判斷 !!. 跟 ?. 的區別跟用法
?.意思是這個參數可以爲空,並且程序繼續運行下去
!!.的意思是這個參數如果爲空,就拋出異常
?.
//kotlin:
a?.run()
//java代碼:
if(a!=null){
a.run();
}
-------------------------------------------
!!.
//kotlin:
a!!.run()
//java代碼:
if(a!=null){
a.run();
}else{
throw new NullPointException();
}