安全调用变量链中的最后一个属性

时间:2019-02-24 20:54:07

标签: kotlin nullpointerexception

阅读Null Safety in Kotlin并很好奇为什么变量链(例如.next永远不会以bob?.department?.head?.name结尾-检查最后访问的属性是否不为null(在这种情况下为{{1} }。

我正在做Nullable Types on Kotlin Koans,很好奇为什么答案不能是

?

代替(答案):

name

2 个答案:

答案 0 :(得分:1)

如果电子邮件为空或不为空,您仍然必须执行操作。抛出一个假肢?返回?执行else块?什么?

写答案的两种替代方法很接近您想要的

client?.personalInfo?.email ?.let { email ->
  if (message != null) { mailer.sendMessage(email, message) }
}

val email = client?.personalInfo?.email ?: return
if (message != null) { mailer.sendMessage(email, message) }

答案 1 :(得分:0)

?的含义。可能与您认为的有所不同。它所做的只是在可为空的对象上导航。

那么鲍勃?部门给你一个部门?相反,如果您使用bob.department,则由于bob中的department可为空,则会出现编译错误。

该链不能以?结尾,因为 没有? 。您可以使用 ?。或?:

您有3个选择:

  1. 将链的结果存储到类型为Something的变量中?
  2. 使用?:运算符终止链。在这种情况下,您必须为该值为null(也称为默认值)的情况提供替代方法。
  3. 使用?.let {}继续链。仅当链的结果不为空时,才会执行lambda中的代码