Kotlin 如何处理 null 类对象?

How does Kotlin handle null class objects?

提问人:Nytrez 提问时间:7/28/2022 最后编辑:Nytrez 更新时间:7/28/2022 访问量:186

问:

我很好奇 Kotlin 如何处理空值,更具体地说,我的意思是:

class aClass(val input : Int ){
    val field = input
}

fun main() {
    val obj : aClass? = null
    if(obj?.field == null) {
        println("true returned")
    }
}

在这部分代码中,aClass 类型的对象 obj?作为 null 启动,尽管 field 字段未初始化,但检查字段是否等于 null 的 if 语句返回 true。我知道在 Java 中它会抛出一个错误,即字段未初始化,我们需要首先检查对象是否为 null,然后检查字段是否为 null。

我在任何地方都找不到答案。 所以我的问题是 Kotlin 是如何做到的?默认情况下,它是否将 null 对象的每个字段都视为 null,或者它是否启动了所有字段都等于 null 的对象,也许它只是检查对象是否为 null,甚至不检查字段字段并返回 true,或者其他什么?

kotlin nullpointerException null 可为 null

评论


答:

1赞 Tenfour04 7/28/2022 #1

?.是安全呼叫接线员。当您使用它来调用可为 null 的变量的函数或属性,并且该变量当前为 null 时,它会直接返回 null,而不调用该函数或属性。如果该属性或函数通常返回不可为 null 的类型,则安全调用的结果将是该类型的可为 null 的版本。

obj?.field是 的简写。(if (obj == null) null else obj.field)

官方文档在此处进行了描述。

1赞 Sweeper 7/28/2022 #2

也许它只是检查对象是否为 null,甚至不检查字段field

完全。这就是安全导航操作员所做的。 计算结果为 Immediately,如果为 null,则根本不计算。因此,在您的例子中,计算结果为 because 为 null。?.a?.bnullabobj?.fieldnullobj

另一方面,如果您使用了 而不是 ,则如果为 null,它将抛出异常 ()。!!.?.NullPointerExceptionobj

我在任何地方都找不到答案。

有关的信息在这里。关于的东西在同一页面上,?.!!

您还可以参考 Kotlin 语言规范中的导航运算符部分或非空断言表达式部分。