Kotlin系列(四)——空安全

​​​​在这里插入图片描述

空安全

字符型的有效性判断

Kotlin引入的空安全绝对是其相当有特点的。在以往的开发工作中少不了要跟各种异常做斗争。要说日常开发中最常见的异常,空指针NullPointExCeption肯定是最让人头痛。一旦调用某个空对象的方法,就会产生空指针异常。并且空指针编码的时候还不会包错,开发者也通常意识不到问题。只有闪退、崩溃的时候查看日志知道。“哦,这里有一个空指针异常”
因为空指针只是狭义上的空值,广义上的空指除了空指针之外,还包括其他开发者认可的情况,比如说String类型,字符串的长度为0时也可算是空值;如果自负床的内容全部是空格组成,某种意义上也是空值。对于字符串的非空判断,用Java书写可以见下面的代码:

if (str!=null && str.length()>0 && str.trim().length()>0) {
    ......
}

以上代码可以看出来代码是比较冗余的,所以Kotlin对校验字符串空指有拓展如下几个方法

  • isNullOrEmpty:为空指针或者字符串长度为0时返回true,非空串与可空串均可调用
  • isNullOrBlank:为空指针、字符串长度为0或者全是空格时返回true,非空串和可空串均可调用
  • isEmpty:字符串长度为0返回true,只有非空串可调用
  • isBlank:字符串长度为0或者全为空格时返回true,只有非空串可调用
  • isNotEmpty:字符串长度大于0时返回true,只有非空串可调用
  • isNotBlank:字符串长度大于0且不是全空格串时返回true,只有非空串可调用。

声明可空变量

字符串的空值校验方法有区分非空串和可空串,起因由于Kotlin引入了空安全的概念,每个类型的变量部分都分作不可为空,和可以为空两种,在前面的介绍中,正常声明的变量都默认时非空(不可为Null),比如下面字符串变量的代码:

	var strNotNull:String = ""

非空变量要么在声明的时候就赋值,要么在方法调用前赋值;否则未经初始化就调用改变量的方法,Kolin会像语法错误那样标红提示:“Variable *** must be initialized。至于可以为空的变量,可在声明的时候在类型的后面加个问号。如果声明一个可空字符串变量,具体的代码例子如下所示:

var strCanNull:String?

现在定义了两个字符串,其中strNotNull为非空串,strCanNull为可空串,按照前面几个字符串空指校验方法的规则,strNotNull允许调用全部的6个方法,但strCanNull只允许调用isNullOrEmpty和isNullOrBlank两个方法。
可以知道,确定字符串可空的时候,是有部分方法是不能使用的,因为Kotlin判定如果为可空字符串,如果字符串为空,调用相关方法可能会报空指针

校验空值的运算符

因为访问空支付穿的length属性会扔出空指针异常,所以Kotlin为此加了个标记,告诉编译器遇到空指针别扔异常,就直接返回空指针就好了,至少避免了处理异常的麻烦,对应的Kotin标记代码如下所示:

        var strB:String? = null
        var lengthNull:Int?
        lengthNull = strB?.length
        print("lengthNull 的值是 $lengthNull")

打印如下

lengthNull 的值是 null

从以上代码可以看到,这个多出来的标记是个问号,语句”strB?.length“其实等价于”lengthNullt= if (strB!=null) strB.length else null“。但是,改语句意味着返回值仍然可能为空,如果不想再界面上展示”null"。要想解决这个问题,Kotlin又引入了新的运算符”?:“,学名叫做”Elvis操作符“,叫起来有点拗口,读者可以将它看作Java的三元运算符”变量名 = 条件语句?取值A:取值B“的缩写,引入运算符”?:“的实现代码如下所示

        var strB:String? = null
        var lengthNull:Int?
        lengthNull = strB?.length?:-1
        print("lengthNull 的值是 $lengthNull")

打印如下

lengthNull 的值是 -1

当然如果百分百确定strB非空,Kotlin还是引入了另一种运算符”!!“,表示不要管这么多,前方没有空指针,把双感叹号加在变量名称后面表示强行把改变量从可空类型转换为非空类型,从而避免变量是否非空的校验

   var strB:String? = "确定这个字符串不是为空的"
   var lengthNull:Int?
   lengthNull = strB!!.length
   print("lengthNull 的值是 $lengthNull"

运算符!!强行放弃了非空判断,开发者九幺自己注意判断了,如果出现空指针,App运行依然会抛出异常,开发者还是需要增加异常捕获处理。

总结:Kotlin引入了空安全的概念,并在编译时开展变量是否为空的校验,相关的操作符说明概括如下:

  1. 声明变量实例时,在类型名称后面加问号,表示该变量可以为空。
  2. 调用变量方法时,在变量名称后面加问号,表示一旦变量为空时就返回null
  3. 新引入运算符“?:”,表示一旦变量为空,就返回该运算符后边的表达式
  4. 新引入运算符“!!”,通知编译器不做非空校验,如果运行时发现变量为空,就扔出异常。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值