以前,当我们不确定一个DTO类中的字段是否已初始化时,可以使用@Nullable和@NotNull注解来声明,但功能很有限。

现在好了,Kotlin在编译器级别,把你之前在Java中需要写的null check代码完成了。

但是,当我们的代码

  • 显式调用
  • 使用了 !! 操作符
  • 调用的外部 Java 代码有NPE
  • 对于初始化,有一些数据不一致(如一个未初始化的 this 用于构造函数的某个地方)

也可能会发生NPE。

在Kotlin中null等同于空指针。我们来通过代码来看一下null的有趣的特性:

这样,我们就可以放心地调用 a 的方法或者访问它的属性,不会导致 NPE

  1. >>> val a="abc"
  2. 3

如果要允许为空,我们可以在变量的类型后面加个问号声明一个变量为可空的:

如果我们声明了一个可空String?类型变量na ,然后直接调用length属性,这将是不安全的。编译器会直接报错:

  1. >>> var na:String?="abc"
  2. >>> na=null
  3. >>> na.length
  4. error: only safe (?.) or non-null asserted (!!.) calls are allowed on a nullable receiver of type String?
  5. na.length
  6. ^

我们使用安全调用?. 和 非空断言调用

我们可以看出,代码返回了nullkotlin.KotlinNullPointerException

如果要只对非空值执行某个操作,安全调用操作符可以与 let (以调用者的值作为参数来执行指定的函数块,并返回其结果)一起使用:

  1. >>> listWithNulls
  2. [A, B, null]
  3. >>> listWithNulls.forEach{
  4. ... it?.let{println(it)}
  5. ... }

本章我们学习了Kotlin语言的基本词汇(关键字、标识符等)、句子(流程控制、表达式、操作符等)和一些基础语法。同时,学习了空指针安全、扩展函数与扩展属性等的语言特性。

我们将在下一章节中介绍Kotlin的基本类型和类型系统。

1.

2.https://en.wikipedia.org/wiki/Elvis_operator