Kotlin语言默认情况下所有的数据类型都是非空类型(Non-Null),声明的变量都是不能接收空值(null).Kotlin的非空判断能够有效防止空指针异常,空指针异常引起的原因视图调用一个空的对象的函数或属性。就这样抛出空指针异常。为此kotlin为每一种非空类型提供对应的可空类型,就是在非空类型后面加上问号(?)表示可空,在可空对象调用时提供了相关的运算符,
- 安全调用运算符(?.)
- 安全转换运算符(as?)
- Elvis运算符(?:)
- 非空断言(!!)
安全调用符(?.)
可空类型变量在使用非空调用运算符可以调用非空类型的函数或者属性,安全调用运算符或判断可空类型变量是否为空,如果为空不会调用函数或者属性,直接返回空值,否则返回运算调用结果。
fun divide(n1: Int, n2: Int): Double? {
//n2=0 则返回空
if (n2 == 0) {
return null
}
//n2不为空 则返回运算结果
return n1.toDouble() / n2
}
fun main(args: Array<String>) {
val number1 = divide(100, 0)
val result1 = number1?.plus(100)
println("result1:" + result1)
val number2 = divide(100, 10)
val result2 = number2?.plus(100)
println("result2:" + result2)
}
运算结果:
2-1.png
非空断言运算符(!!)
可空类型变量可以使用非空断言运算符(!!)调用非空类型的函数或者属性。非空断言运算符(!!)断言可空类型不会为空,调用过程总存在风险,如果非空类型变量真的为空,则或抛出空指针异常,不为空则返回运算结果。
fun divide(n1: Int, n2: Int): Double? {
//n2=0 则返回空
if (n2 == 0) {
return null
}
//n2不为空 则返回运算结果
return n1.toDouble() / n2
}
fun main(args: Array<String>) {
val number1 = divide(100, 0)
val result1 = number1!!.plus(100)
println("result1:" + result1)
val number2 = divide(100, 10)
val result2 = number2?.plus(100)
println("result2:" + result2)
}
2-2.png
运行代码出现空指针异常的原因就是空的变量使用非空断言运算符调用非空的属性或者方法出现的问题,修改方法后为:
fun main(args: Array<String>) {
val number1 = divide(100, 0)
val result1 = number1?.plus(100)
println("result1:" + result1)
val number2 = divide(100, 10)
val result2 = number2!!.plus(100)
println("result2:" + result2)
}
2-3.png
Elvis运算符(?:)
在可空类型表达式中,当表达式只为空是,不希望其表达式返回空值,希望是返回一个默认的值,则可以使用Elvis运算符(?:),就针对以上代码可做修改,针对非空变量调用非空类型的属性或者方法;
fun divide(n1: Int, n2: Int): Double? {
//n2=0 则返回空
if (n2 == 0) {
return null
}
//n2不为空 则返回运算结果
return n1.toDouble() / n2
}
fun main(args: Array<String>) {
val number1 = divide(100, 0)
val result1 = number1?.plus(100) ?: 0
println("result1:" + result1)
val number2 = divide(100, 10)
val result2 = number2!!.plus(100)
println("result2:" + result2)
}
运行结果:
3-4.png
到此可空类型学习完成!如果有什么不对的地方希望童鞋们指出!
网友评论