寫過Java專案的人,一定常苦腦於程式閃退問題。一查log,靠北喔,怎麼死於 NullPointerException(NPE)。明明就已經考慮清楚,此段不可能NPE啊,怎麼查都找不到原因。花了很多時間才查到原來是使用者沒有正常操作或是一些莫名奇妙的問題所產生。
可空型別(Nullable)與不可空型別(Non-null)
Kotlin為了消除Java的苦腦而重新設計。kotlin預設變數都是不可有空值,這樣就不會有NPE了。
等等,怪怪的喔!! 這跟怕駭客入侵網路,就把網路線拔掉有啥區別? 又等等,真的有人會作這種蠢事嗎? 有的,台灣所有的政府單位就是這麼搞的。
當然,kotlin絕對不可能這麼吃屎。因為它只是預設不能有空值,但也可以手動改成有空值。也就是在變數型態後面加上 “?”。
fun main(args:Array<String>) {
var a:Int=0
a=null//此行錯誤,因為a不可以有空值
var b:Int?=0
b=null//b允許有空值
}
空值處理
當變數宣告為可空值時,下面紅面部份無法編譯,會出現
Only safe(?.) or non-null asserted(!!.) calls are allowed on a nullable receiver of type Int?
fun main(args:Array<String>) {
var a:Int?=null
var f=a.toFloat()//此行會出現錯誤無法編譯
}

正確的處理方式是在轉換之前,要先用if判斷一下a是否為null,如下所示
