What is exactly null in kotlin and why i can't cause NPE with it?

Fri*_*iek 0 kotlin

Look at the following code running in Kotlin REPL:

>>> null.takeIf({1==2})
res4: kotlin.Nothing? = null
Run Code Online (Sandbox Code Playgroud)

Why this don't cause NullPointerException?

Ale*_*hin 7

您的代码不会引起NullPointerException,因为takeIf它是扩展功能。
扩展函数被转换为方法接收器,第一个参数是调用函数的对象。

因此null.takeIf { false },您可能想知道为什么以下函数没有引发NullPointerException 而不是(简化示例):

fun <T> takeIf(me: T, predicate: (T) -> Boolean): T? {
    ...
}
Run Code Online (Sandbox Code Playgroud)

好吧,为此,我们需要研究takeIf()实现(删除注释和协定):

public inline fun <T> T.takeIf(predicate: (T) -> Boolean): T? {
    return if (predicate(this)) this else null
}
Run Code Online (Sandbox Code Playgroud)

因此,如果您的谓词为假(如您的示例中的1==2),则它只会短路并返回null。

那是什么true呢?我们最终会得到一个NullPointer吗?

不:

val nothing: Nothing? = null.takeIf {
    true
}
Run Code Online (Sandbox Code Playgroud)

  • 2. 类型是 `Nothing?`,而不是 `Nothing`,这就是为什么 `null` 是一个合法值。 (2认同)