• 浅谈Kotlin(八):空安全、空类型


    首先非空变量和可空变量的区别:

    // name为不可为空的变量, 不能赋值为null ,若有判断 if(name==null) 无意义,因为肯定不为null
    var name : String = ""
    // role 为可空变量
    var role : String? = ""

    非空变量赋值为Null为报如下错误:

    一、判断可空变量是否为null的方式

    1、

            var name : String ?= ""
            if (name == null){
                Log.i(Tag,"name==null")
            }else{
                Log.i(Tag, "name!=null")
            }

    2、

    ?.的意思为若name为null 。则返回null

            var name : String ?= "abc"
            Log.i(Tag,"name="+name?.length)

    二、涉及到返回可空值的函数使用方法,在返回类型后同时加?

    var name:String?="abc"
    
    fun getNameLength():String?{
          return name
    }

    三、let操作符

    用法:变量?.let{ ... } , 作用为忽略null的情况

    例如筛选出一个集合非空的元素集合

    常规写法:

        fun logUnNullList(arr:Array<String>):Unit{
            for (item in arr){
                if (arr==null){
                    continue
                }else{
                    Log.i(Tag,"非空元素为->"+item)
                }
            }
        }

    用let操作符写法:

        fun logUnNullList(arr:Array<String>):Unit{
            for (item in arr){
                item?.let {Log.i(Tag,"非空元素为->"+item)  }
            }
        }

    四、Evils操作符(?:   !!  as)

    1、?:

    对于一个可空变量的使用,若当该变量为空的时候赋予一个特定值使用

    var name:String?="abc"
    var nameLength:Int = 0
    nameLength = name?.length?:-1  // 取name的length ,若name为null,则nameLength的值为-1

    这样要比传统写法 if(name==null) -1 else name.length 要简介

    2、!!

    在一个可空变量使用的时候后面加上!! ,则当该变量为null的时候抛出空指针异常

    var name:String?=null
    nameLength = name!!.length

    此时name为null ,因为使用了!! ,则抛出空指针异常

    3、as、as?

    类型转换

    当使用as的时候若类型转换失败则抛出类型转换(ClassCastException)异常

    当使用as?的时候若类型转换失败则返回null,不会抛出异常

    var name:String?= 12 as String

    可见12 转换String 类型异常

    当使用as?的时候

    var name:String?= 12 as? String
    Log.i(Tag,"name="+ name)
    // 打印日志: name=null

    总结:

    抛出异常的 !! as 尽量少用,用as?  ?.  ?:  let来代替

    作者:听着music睡

    出处:http://www.cnblogs.com/xqxacm/

    Android交流群:38197636

    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

  • 相关阅读:
    Oracle 11g db_ultra_safe参数
    How To Configure NTP On Windows 2008 R2 (zt)
    Brocade光纤交换机密码重置 (ZT)
    perl如何访问Oracle (ZT)
    Nagios check_nrpe : Socket timeout after 10 seconds
    oracle10g单机使用ASM存储数据
    Xmanager无法连接Solaris10 (ZT)
    Solaris10配置iscsi initiator
    oracle 11g dataguard 创建过程
    Nagios check_procs pst3 报错
  • 原文地址:https://www.cnblogs.com/xqxacm/p/15741097.html
Copyright © 2020-2023  润新知