• 浅谈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

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

  • 相关阅读:
    selenium 8大元素定位方法
    selenium环境安装及简单使用
    Python json序列化和反序列化
    pytest使用allure生成测试报告
    Windows10下JDK15的安装教程
    Ansible:服务器巡检_3、Windows 平台巡检
    转载:shell中各种括号的作用详解()、(())、[]、[[]]、{}(推荐)
    Tips: Linux 中 当形参名称是 变量时,如何取出全部的实参
    Python 问题记录:XXX.whl is not a supported wheel on this platform.
    Ansible:服务器巡检_2、Linux 服务器巡检脚本
  • 原文地址:https://www.cnblogs.com/xqxacm/p/15741097.html
Copyright © 2020-2023  润新知