指定一个变量可null是通过在它的类型后面加?号,如
val a: String? = null 复制代码
(注意这个Int也可为空是因为在kotlin中一切都是对象,包括在java中的基本类型)
一个可null类型,没有进行检查前不能使用,如下代码会编译出错
val a: String? = null a.subString(2) 复制代码
kotlin另外一个特性是当我们检查了一个可null类型,这个对象会自动转型成不可null类型,这就是Kotlin编译器的智能转换,如
val a: String? = null if(a != null){ a.subString(2) } 复制代码
在if语句中,a从Int?变成了Int,所以可以直接使用。但是在if代码外,则需要重新检查。
当然这仅仅在变量当前不能被改变的前提下,如果变量可能被另外线程改变就会变得复杂。
如果我们处处去做判断,代码会臃肿起来,kotlin中有更简洁的处理方式,如:
val a: String? = null a?.subString() 复制代码
我们使用安全访问符"?",只有当不为null的时候才执行这行代码。否则不会做任何事情。
但是注意如果有赋值行为的话,a为null的话会返回null,如:
val a: String? = null val s = a?.subString() 复制代码
s会被赋值为null
kotlin中还有一种_Elvis operator_(?:)操作符,使用如下:
val a: String? = null val s = a?.subString(2) ?: "" val s = a?.subString(2) ?: return false val s = a?.subString(2) ?: throw IllegalStateException() 复制代码
在kotlin中return和throw都是表达式,所以可以用在_Elvis operator_操作符右边
当我们确定一个非null变量不为null,我们可以使用"!!"来强制跳过检查正常编译,如:
val a: String? = null a!!.subString(2) 复制代码
当然不推荐经常使用,因为是未经检验的存在null指针崩溃的可能。
在android新版本中,我们可以用@Nullable和@NotNull注解来辨别参数是否可以为空或者函数返回是否可以为空。