1. ?

声明一个变量可为空。

  1. var b: String? = "abc" // 可以设置为空

2. ?.

判空操作
2.1

  1. val a = "Kotlin"
  2. val b: String? = null
  3. println(b?.length)
  4. println(a?.length) // 无需安全调用

如果 b 为空,返回 null,否则就返回 b.length。
2.2
如果要只对非空值执行某个操作,安全调用操作符可以与let 、run等一起使用:

  1. val listWithNulls: List<String?> = listOf("Kotlin", null)
  2. for (item in listWithNulls) {
  3. item?.let { println(it) } // 输出 Kotlin 并忽略 null
  4. }

3. ?:

Elvis操作符。
如果 ?: 左侧表达式为空,则返回右侧表达式,否则返回左侧表达式。 请注意,当且仅当左侧为空时,才会对右侧表达式求值。

  1. val l = b?.length ?: -1

4. !!

非空断言运算符。若值为空则抛出异常。

  1. val l = b!!.length

我们可以写 b!! ,这会返回一个非空的 b 值 (例如:在我们例子中的 String)或者如果 b 为空,就会抛出一个 NPE 异常。

5. as?

安全的类型转换,如果尝试转换不成功则返回 null:

  1. val aInt: Int? = a as? Int