Kotlin基础认识 (5)可空数据类型

一、可空类型概念

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
}

你可能感兴趣的:(Kotlin基础认识 (5)可空数据类型)