Java中常见的错误就是访问空引用的成员变量,导致空引用异常,就是我们 常说的空指针异常--NullPointerException(简称为NPE).
一、kotlin中允许一个变量可以为空字符串,写作--String?
栗子1:
var a:String?="abc"
a=null;//编译可用过
栗子2:
var b:String="abc"
b=null;//编译错误
原因:因为变量b在声明时没有指明可以为null的属性
同理: 在我们访问一个变量a(为可以为空的类型)的属性或者方法时,应该保证 其不会造成NPE;
val l=a.length()//编译错误
原因:变量a可能会是null,
但是访问变量b的相同方法,则不会出现这个问题
val l=b.length()//因为变量b不可为空
二、使用条件语句检测是否为null
场景:判断变量b是否为空,我们可以有两种选择:
a:
val l=if(b!=null)b.length else -1
b:
if (b != null && b.length > 0)
print("String of length ${b.length}")
else
print("Empty string")
注意事项:
需要注意的是变量b为不可变量,不然会检测为空从而导致异常。
三、安全的调用
A.基本介绍
安全操作符?.
表达式: b?.length
表示的意义:若b为非空变量,就会返回b.length,否则就返回null.该式的完整表达式:
val a:Int?=b?.length
B.运用在链式调用
在此情况下,安全调用是十分有用的。
栗子:
如果Bob,一个雇员,可被分配给一个部门(或不),这反过来又可以获得 Bob 的部门负责人的名字(如果有的话),我们这么写:
bob?.department?.head?.name
如果任意一个属性(环节)为空,这个链式调用就会返回 null{: .keyword }。
四:Elvis操作符?:
场景:
我们有一个可以为null的变量,其操作的场景为如果该变量为非空时,我们使用它 (操作该变量的属性或者方法);否则使用一个非空的值:
val l:Int=if(b!=null) b.length else -1
对于完整的IF表达式,我们可以换成Elvis操作符进行表示:
val l:Int=b?.length?:-1
具体表达的含义:
如果?:左边的表达式为非空时,Elvis操作符就会返回左边的结果,否则返回右边的内容。
注意事项:
因为 throw{: .keyword } 和 return{: .keyword } 在 Kotlin 中都是一种表达式,它们也可以用在 Elvis 操作符的右边。非常方便,例如,检查函数参数:
fun foo(node: Node): String? {
val parent = node.getParent() ?: return null
val name = node.getName() ?: throw IllegalArgumentException("name expected")
// ...
}
五 操作符 !!
我们可以写成 b!!,这样就会返回一个不可以为空的b的值,如果b为空,这是就会抛出NPE异常。
在(一)中的栗子中有:
val l:Int=a!!.length()
六:安全转型
转型的时候,可能会经常出现 ClassCastException 。 所以,现在可以使用安全转型,当转型不成功的时候,它会返回 null{:.keyword }:
val aInt: Int? = a as? Int