一、可空类型概念
Kotlin的非空类型设计能够有效防止空指针异常。
var intNum = 10
inNum = null // 发生编译错误
- 定义可空类型
var n: Int ?= 10
n = null // 可以接收空值(null)
可空类型使用时的一些限制: |
---|
1、不能直接调用可空类型对象的函数或属性; |
2、不能把可空类型数据赋值给非空类型变量; |
3、不能把可空类型数据传递给非空类型参数的函数; |
为了“突破”这些限制,Kotlin提供了如下运算符: |
---|
1、安全调用运算符 (?.) |
2、安全转换运算符 (as?) |
3、Elvis运算符 (?:) |
4、非空断言 (!!) |
5、还有一个 let 函数帮助处理可空类型数据。 |
二、使用安全调用运算符 (?.)
可空类型变量使用安全调用运算符 (?.) 可以调用非空类型的函数或属性。安全调用运算符 (?.) 会判断可空类型变量是否为空,如果是则不会调用函数或属性,直接返回空值,否则返回调用结果。
fun divide(n1: Int, n2: Int): Double? {
if (n2 == 0) { // 判断分母是否为 0
return null
}
return n1.toDouble() / n2
}
fun doSomethings() {
val divNumber1 = divide(100, 0)
val result1 = divNumber1?.plus(100) // divNumber1 + 100, 结果 null
val divNumber2 = divide(100, 10)
val result2 = divNumber2?.plus(100) // divNumber2 + 100, 结果 110.0
}
三、非空断言运算符 (!!)
可空类型变量可以使用非空断言运算符 (!!) 调用非空类型的函数或属性。非空断言运算符 (!!) 顾名思义就是断言可空类型变量不会为空,调用过程是存在风险的,如果可空类型变量真的为空,则会抛出空指针异常;如果非,则可以正常调用函数或属性。
fun divide(n1: Int, n2: Int): Double? {
if (n2 == 0) { // 判断分母是否为 0
return null
}
return n1.toDouble() / n2
}
fun doSomethings() {
val divNumber1 = divide(100, 0)
val result1 = divNumber1!!.plus(100) // 抛出异常
val divNumber2 = divide(100, 10)
val result2 = divNumber2?.plus(100) // 结果 110.0
}
四、使用 Elvis 运算符 (?:)
有的时候在可空类型表达式中,当表达式为空值时,并不希望返回默认的空值,而是返回其他数值。此时可以使用 Elvis 运算符 (?:),Elvis 运算符有2个操作数,假设有表达式:A ?: B,如果 A 不为空值则结果为 A,否则结果为 B。
fun divide(n1: Int, n2: Int): Double? {
if (n2 == 0) { // 判断分母是否为 0
return null
}
return n1.toDouble() / n2
}
fun doSomethings() {
val divNumber1 = divide(100, 0)
val result1 = divNumber1?.plus(100) ?: 0 // divNumber1 + 100,结果 0
val divNumber2 = divide(100, 10)
val result2 = divNumber2?.plus(100) ?: 0 // divNumber2 + 100,结果 110.0
}
网友评论