[Kotlin]Kotlin学习笔记(三):Null检查机制及lateinit与by lazy(委托机制)的应用

本文详细介绍了Kotlin的Null检查机制,包括?和!!的安全调用符,以及如何避免NullPointerException。同时,讨论了lateinit与by lazy的用法和区别,解释了它们在延迟初始化中的作用,帮助理解Kotlin的委托机制。
摘要由CSDN通过智能技术生成

>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)
  • 调用一
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值