啥是空指针异常
我相信你一定遇到过,比如在写链表算法时,写x.next.next时,可能会遇到null对象没有next这个字段。这是因为x.next是个null的话,那么null.next自然就会抛出异常。在Andriod开发中,也很多会出现这个异常,但我印象中,Android空指针异常的产生大多数时候不是自己写的。(可能吧)
不能为null
//1.作为参数
fun strLen(s: String) = s.length
fun main(args: Array<String>) {
strLen(null) //直接编译期报错
}
//2.作为变量
var s = ByteArray(1024)
s = null //也不能这样来帮着GC
声明可以为null的类型
//1.作为参数
fun strLen(s: String?) = s.length
fun main(args: Array<String>) {
strLen(null) //直接编译期报错
}
//2.作为变量
var s: ByteArray? = ByteArray(1024)
s = null //也不能这样来帮着GC
安全访问符 ?.
fun strLen(s: String?) = s?.length
//等价于if (s != null) s.length else null
Elvis操作符(猫王操作符)?:
A ?: B, 如果A为null则B
fun foo(s: String?){
val s: String = s ?: ""
val l:Int = s.length ?: throw Exception()
}
安全转换 as?
不能转换则为null,之后还能组合加 ?: 表达式
val p: Person? = o as? Person
非空断言 !!
如果为null,则会报一个错误, 尽量不要一行中多次断言
fun ignoreNulls(s: String?){
val sNotNull: String = s!!
println(sNotNull.length)
}
let函数
调用者不为null则进入{},否则什么都不做
email?.let{ email -> sendEmailTo(email) }
集合类型