目录
Kotlin刚推出来时就一直宣传解决Java中空指针的痛点。java.lang.NullPointerException这个熟不熟悉,哈哈怎么解决的呢?kotlin引入了可空类型,给开发者带来了完美的解决方案,下面就来学习学习一下kotlin中可空类型。
什么是可空类型?简单的理解就是可以为空的类型,换句话说就是任何实体类型跟null的组合。Kotlin中是在原有的类型后跟一个‘?’表示,比如:
Int? String? Boolean?
可空类型的变量
kotlin中可以直接将一个变量声明为可空类型,允许它为空,比如:
fun main() {
//可空变量声明,允许name为空
var name: String?
//对name 赋值为空
name = null
println(checkNull(name))
name = "Alfred"
println(checkNull(name))
}
fun checkNull(str: String?): String? {
return str
}
结果:
null
Alfred
声明一个String
类型的参数,并且String
后面多了一个?
,这就是kotlin的可空类型的声明。checkNull根据传递参数返回null或name。
安全调用运算符:"?."
接着我们来看看如何运用这个可空变量,我们通过一个例子来欣赏下安全调用运算符的强大之处。
fun main() {
val name: String? = null
println(name?.length)
}
结果:null
kotlin却没有抛出空指针,而是返回了null
,让我们来看看内部如何处理的:
只有当name
不为空时,才会调用length()
方法,name
为空的时候,直接返回了null
,这下再也不怕忘记处理空指针的情况了。
Elvis运算符:"?:"
在日常开发中我们也许会遇到这么一个情况,如果获取不到用户名,就按默认名称来显示。比如:
fun main() {
val name: String? = null
println(getName(name))
}
fun getName(str: String?): String? {
return str ?: "Zhang San"
}
结果:Zhang San
当name为空时返回"Zhang San",当name不为空时直接返回name。我们来看看内部实现的原理,结合下图分析:
bar
是用来代替默认值null
的,如果foo==null
,那么就直接返回bar
,和java中string == null ? "--" : string;
三元运算符作用类似。
非空断言:"!!"
kotlin还提供了一个运算符,如果你确定你的变量不可能为空,那么就可以使用!!来修饰你的变量,这种情况下,如果你的变量出现了null
的情况,就会抛出空指针异常,我们来通过代码感受下:
fun main() {
val name: String? = null
println(name!!)
}
fun getName(str: String?): String? {
return str ?: "Zhang San"
}
结果:
Exception in thread "main" kotlin.KotlinNullPointerException
at FirstKotlinKt.main(FirstKotlin.kt:6)
at FirstKotlinKt.main(FirstKotlin.kt)
Process finished with exit code 1