>Null检查机制
Kotlin中,使用 ? !!这两个安全检测操作符来进行安全值检测。其目的是为了消除Java中常见的NPE异常(NullPointerException)。要想正确理解Kotlin中这两个安全检测符,就要知道Java中触发NPE的原因主要有哪些:
- 显示调用抛出NullPointerException的方法(较易被肉眼发现)
- 对象忘记赋值、多线程运行造成的空指针、时序造成的空指针等初始化赋值原因导致的空指针
在Kotlin中,对每个var和val都要求强制赋初值,否则在使用该值及其本身属性与方法时均为编译报错,这就使得上述两个原因中的第二个得到了很大程度的根除。首先要认识这两个符号的具体用法:
看上图,我在main()函数中定义了一个字符串(String)变量t,并未附初值,由于String不是Nullable的数据类,所以此时IDE报错。由于t不可为null,因此此时对t=null,IDE也是会报错的。
那么如果我想让 t=null 通过编译,我需要用利用 ? 符来标识这个类型:var t:String? ,告诉编译器,我定义的这个类型可为null,也就是nullable;
此时 t=null 是可以通过IDE编译的,但能否调用它的属性或方法呢?如图:
依旧是不行的,首先,它会告诉你这个值未被初始化,让后告诉你,只有 ? 或 !! 类型的调用才能对一个被表示为nullable的变量进行操作:
有人可能会有疑问,既然此时t可为空了,并利用 ?.是可以使用其属性的。那对象本身为空,这样不就抛出NPE了吗?
其实不然,?. 操作符被叫做安全调用符,如果程序运行到这里发现对象本身为空,那么就不执行任何指令,相当于:
if(obj==null);
else obj.fun();
那么,现在再来回顾一下 ? 操作符的使用方法:
- 定义一个var或者val时,加在类型后,表示这个值可为空(可以被赋值null)
- 调用一