据统计,市场上java程序的bug超过50%都是空指针异常,那么kotlin为了改善这个问题,加入了可空类型,在java程序中,变量可以直接赋值为null,但是在kotlin中不能这样1
2
3
4fun main(arg: Array<String>) {
var a: Int = null
println(a)
}
以上代码在编译的时候会报错,提示: error: null can not be a value of a non-null type Int
那么如果想要a变量可以赋值为null可以使用可空类型标示符”?”
可空类型
1
2
3
4fun main(arg: Array<String>) {
var a: Int? = null
println(a)
}在类型声明后面跟一个?号就可以定义一个可空变量,由可空类型又引出了安全调用符以及Elvis运算符
安全调用符
如果不使用安全调用符”?”对可空对象进行方法调用,编译会出错1
2
3
4
5fun main(arg: Array<String>) {
var a: String? = null
var b: Int = a.toInt()
println(b)
}以上代码编译的时候会报:
1
error: only safe (?.) or non-null asserted (!!.) calls are allowed on a nullable receiver of type String?
第一种解决办法,使用提示建议的非空断言”!!”告诉编译器这个对象不可能为空
1
2
3
4
5fun main(arg: Array<String>) {
var a: String? = null
var b: Int = a!!.toInt()
println(b)
}但是这样做虽然可以编译通过,但是在执行时仍然会报空指针异常
1
Exception in thread "main" kotlin.KotlinNullPointerException
所以另一种解决办法为使用安全调用符”?”
1
2
3
4
5fun main(arg: Array<String>) {
var a: String? = null
var b: Int? = a?.toInt()
println(b)
}使用安全调用符的同时需要将接受对象声明为可空类型
Elvis运算符
在上面提到的对可空对象进行操作时,如果操作目标为空值则返回的是null或者空指针异常,那么使用Elvis运算符可以修改为空时返回的值1
2
3
4
5fun main(arg: Array<String>) {
var a: String? = null
var b: Int? = a?.toInt()?: -1
println(b)
}使用Elvis运算符后程序打印结果为-1