美文网首页Kotlin
Kotlin学习(三)——可空类型、空安全和Elvis 操作符

Kotlin学习(三)——可空类型、空安全和Elvis 操作符

作者: 苍天霸气诀 | 来源:发表于2019-09-30 10:03 被阅读0次

    1.1 定义一个可空类型的变量

    定义一个可空类型的变量的格式为:修饰符 变量名 : 类型? = 值
    
    

    例如:

    fun main(args: Array<String>) {
                var nullA : Int? = 12
    
                nullA = null
    
                if(nullA == null){
                    println("nullA = $nullA")
                }
    
            }
    

    输出:

    nullA = null
    

    分析:要定义一个可空类型的变量时,即在定义变量的类型后面加上?符号就行了。在使用的时候,记住要判断该段该变量是否为空,这个操作在Java中经常会用到...,如果定义一个不可为空类型的变量时,则判断将毫无意义,因为这个变量永远不会为空。

    1.2、判断可空类型的使用方式

    使用符号?.判断

    • 该符号的用法为:可空类型变量?.属性/方法。如果可空类型变量为null时,返回null
    • 这种用法大量用于链式操作的用法中,能有效避免空引用异常(NullPointException),因为只要链式其中的一个为null,则整个表达式都为null

    例如:

    var name:String ?="张三"
                name=null
                println(name?.length)
    

    输出:

    null
    

    let操作符

    //另一种用途 判断object为null的操作
    object?.let{//表示object不为null的条件下,才会去执行let函数体
       it.todo()
    }
    

    Evils操作符

    • ?: 这个操作符表示在判断一个可空类型时,会返回一个我们自己设定好的默认值.
    • !! 这个操作符表示在判断一个可空类型时,会显示的抛出空引用异常(NullPointException).
    • as? 这个操作符表示为安全的类型转换.
    ?:

    例如:

    var name:String ?=null
         
                var length = 0
                length=name?.length?:-1
    

    输出:

    -1
    

    一个可空类型的变量时,如果该变量不为空,则使用,反之使用另外一个不为空的值

    !!操作符
                var name:String ?=null
                println(name!!.length)
    

    输出

    Exception in thread "main" kotlin.KotlinNullPointerException
        at com.example.myapplication.Main$Companion.main(Main.kt:21)
        at com.example.myapplication.Main.main(Main.kt)
    

    在未做空判断的情况下直接使用操作符!!的情况下,抛出了空异常

    as?

    表示类型转换,如果不能正常转换的情况下使用as?操作符。当使用as操作符的使用不能正常的转换的情况下会抛出类型转换(ClassCastException)异常,而使用as?操作符则会返回null,但是不会抛出异常

    as
    var nums="Koltin"
    val num1 : Int? = nums as Int
    println("nun1 = $num1")
    

    输入结果:

    Exception in thread "main" java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer
        at com.example.myapplication.Main$Companion.main(Main.kt:28)
        at com.example.myapplication.Main.main(Main.kt)
    
    as?
    var nums="Koltin"
        val num1 : Int? = nums as? Int
        println("nun1 = $num1")
    

    输入结果:

    
    nun1 = null
    
    总结:
    项目中会抛出空引用(NullPointerException)异常的情况
    • 在可空类型变量的使用时,用了!!操作符
    • 显式抛出空引用异常 throw NullPointerException()
    • 外部 Java 代码导致的
    • 对于初始化,有一些数据不一致(如一个未初始化的 this 用于构造函数的某个地方)
    项目中会抛出类型转换(ClassCastException)异常的情况
    • 在类型转换中使用了as操作符
    • 使用了toXXX()方法不能转换的情况下
    • 外部 Java 代码导致的
    尽量避免使用的操作符
    • 尽可能的不要使用!!操作符,多使用?:、?.操作符,以及let{}函数
    • 尽可能的使用as?操作符去替换掉as,在不确定是否可以安全转换的情况下不使用toXXX()方法

    相关文章

      网友评论

        本文标题:Kotlin学习(三)——可空类型、空安全和Elvis 操作符

        本文链接:https://www.haomeiwen.com/subject/rsrmuctx.html