kotlin空指针校验

类型的说明

变量声明方式 val a: String="tom" 通常会写成val a = "tom" 但还有另一种 val a: String?="tom" 表示非空类型

1
2
3
4
5
6
fun test1() {
    val a1 = 2;
    // val a2 = ss as String // 抛出转换失败的异常
    val a2 = a1 as? String // 转换失败则返回null
    println(a2)
}

使用的说明

针对String?这种带问号的类型, 调用时为了避免空指针需要辅助符号 ?. 表示为空则不调用 且返回null !!. 表示非空断言

完整示例代码

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
package test

class TestNull {
    fun test1() {
        val a1 = 2;
        // val a2 = ss as String // 抛出转换失败的异常
        val a2 = a1 as? String // 转换失败则返回null
        println(a2)
    }

    fun test2() {
        // 类型上多个问号? 是可空变量
        var b1: String = b11()
        var b2: String? = b22()
        var msg = "\n 段落A b1== $b1  b2== $b2"

        // b1 = b2 // 编译不通过 由于b2声明带问号 所以二者类型不同
        b1 = b2!! // 由于b2有可能为空, 加入断言可直接赋值
        msg += "\n 段落B b1== $b1  b2== $b2"
        println(msg)

        if (true) {
            b2 = null
        }
        println("b1长度== ${b1.length}    ")
        println("b2长度== ${b2?.length}   ")
        println("b2长度== ${b2!!.length}   ")// 抛出空指针异常
    }

    fun b11(): String {//返回值不可为空
        return "b-11"
    }

    fun b22(): String? {//返回值可为空
        return "b-22"
    }
}

fun main(args: Array<String>) {
    println("main-开始")
    val tn = TestNull()
    tn.test1()
    tn.test2()
    println("main-结束")
}