Kotlin - 为什么我会得到一个KotlinNullPointerException

ser*_*0ne 8 kotlin

请考虑以下代码:

fun main(args: Array<String>) {
    maybeWriteMessage()
}

fun maybeWriteMessage(message: String? = null) {
    writeMessage(message!!)
}

fun writeMessage(message: String) {
    println("Hello World")
}
Run Code Online (Sandbox Code Playgroud)

产量

com.series0ne.ApplicationKt.maybeWriteMessage中的com.series0ne.ApplicationKt.maybeWriteMessage(Application.kt:8)中的线程"main"kotlin.KotlinNullPointerException中的异常.默认(Application.kt:7)位于com.series0ne.ApplicationKt.main( Application.kt:4)

这是因为我传递message!!(null,该死!)到一个不可为空的参数,但是从不访问该参数.

为什么Kotlin KotlinNullPointerException在没有访问空引用时强行抛出?

d.f*_*ber 13

message: String?表明message可能会或可能不会null.

由于您的函数maybeWriteMessage的默认值为nullfor,message并且您在maybeWriteMessage()未指定message的情况下调用- null将在调用时使用默认值()writeMessage(message!!).

文档中所述,!!-operator在值为时抛出异常null.

writeMessage安全触发的一种方法是使用.let:

fun maybeWriteMessage(message: String? = null) {
    message?.let { 
      writeMessage(it)
    }
}
Run Code Online (Sandbox Code Playgroud)


Dar*_*nko 6

运算符!!抛出一个KotlinNullPointerExceptionifmessage为 null。

你可以在这里阅读:https : //kotlinlang.org/docs/reference/null-safety.html#the--operator

  • 从 Kotlin 1.4 开始,异常将改为 `NullPointerException` (不同类型),请参阅[此处](https://blog.jetbrains.com/kotlin/2019/08/kotlin-1-3-50-released/ )。因此,如果任何代码显式捕获“KotlinNullPointerException”(这是不鼓励的),那么升级到 1.4 将是一个 **重大更改**。 (3认同)