Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kotlin 对变量链中最后一个属性的安全调用_Kotlin_Nullpointerexception - Fatal编程技术网

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

Kotlin 对变量链中最后一个属性的安全调用,kotlin,nullpointerexception,Kotlin,Nullpointerexception,阅读并好奇为什么变量链如bob?.department?.head?.name永远不会以?-检查上次访问的属性在此案例名称中是否为null 我正在做,我很好奇为什么答案不可能是: fun sendMessageToClient(client: Client?, message: String?, mailer: Mailer){ val email = client?.personalInfo?.email? if (message != null){ mailer.sendMe

阅读并好奇为什么变量链如bob?.department?.head?.name永远不会以?-检查上次访问的属性在此案例名称中是否为null

我正在做,我很好奇为什么答案不可能是:

fun sendMessageToClient(client: Client?, message: String?, mailer: Mailer){
    val email = client?.personalInfo?.email?
    if (message != null){ mailer.sendMessage(email, message) }
}

class Client (val personalInfo: PersonalInfo?)
class PersonalInfo (val email: String?)
interface Mailer {
    fun sendMessage(email: String, message: String)
}
而不是答案:

fun sendMessageToClient(client: Client?, message: String?, mailer: Mailer){
    val email = client?.personalInfo?.email
    if (message != null && email != null){ mailer.sendMessage(email, message) }
}

class Client (val personalInfo: PersonalInfo?)
class PersonalInfo (val email: String?)
interface Mailer {
    fun sendMessage(email: String, message: String)
}

如果电子邮件为空或不为空,您仍然需要做些什么。抛出一个解释?回来执行else块?什么

写答案的两种替代方法,与你想要的接近,是

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


什么意思?。可能和你想象的有点不同。它所做的只是在空值上导航

鲍勃?部门给你一个部门?相反,如果您使用bob.department,您将得到一个编译错误,因为在bob中department可以为null

链不能以?结尾,因为没有?操作人员你可以用?。还是

您有3种选择:

将链的结果存储到类型为某物的变量中? 使用?:运算符终止链。在这种情况下,您必须为值为null(也称为默认值)的情况提供一种替代方法 用?.let{}继续链。lambda中的代码只有在链的结果不为null时才会执行
我的第一个建议答案会检查if语句中的电子邮件是否为空。除了问题中koan的实际答案之外,只有一个建议答案。它不会检查电子邮件是否为空。无论如何,如果客户端的personalInfo的电子邮件为空,则client?.personalInfo?.email的值为空。通过声明一个可为null的类型的值并为其赋值,不会发生什么坏事?。非常有用,因为如果客户端为null,client.personalInfo将引发异常。但是空邮件不会引发任何异常。那么增加一个?最后没有任何作用。你认为它应该做什么?为什么空电子邮件不会引发任何异常?如果personalInfo不为空,但电子邮件为空,该怎么办那么你不需要客户?个人信息?电子邮件?val foo=null不会引发任何异常。为什么会这样?导致异常的原因是调用方法或访问null引用的属性:somethingNull.foo我现在理解了。谢谢,有吗?。和?:Kotlin中与表达式一起工作的运算符。这个单独作为类型名上的可空性标记,而不是表达式和as中的可空性标记,才有意义?接线员,好的。这条链条没有终结的意义吗?编译器将检测链中的最终变量是否为null?编译器将检测最终值可能为null。因此,它将结果存储在可为空的类型中。bob?.department给department?,因为bob一开始可能是空的。
val email = client?.personalInfo?.email ?: return
if (message != null) { mailer.sendMessage(email, message) }