Kotlin - почему я получаю исключение KotlinNullPointerException - PullRequest
0 голосов
/ 06 июня 2018

Рассмотрим следующий код:

Пример

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

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

fun writeMessage(message: String) {
    println("Hello World")
}

Вывод

Исключение в потоке "main "kotlin.KotlinNullPointerException в com.series0ne.ApplicationKt.maybeWriteMessage (Application.kt: 8) в com.series0ne.ApplicationKt.maybeWriteMessage $ default (Application.kt: 7) в com.series0ne.ApplicationKt.main (Application.kt:4)

Это потому, что я передаю message!! (ноль, черт побери!) Параметру, который не может иметь значение NULL, однако этот параметр никогда не доступен.* Вопрос

Почему Kotlin принудительно выбрасывает KotlinNullPointerException, даже если нулевая ссылка не доступна?

Ответы [ 4 ]

0 голосов
/ 06 июня 2018

В следующем коде:

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

вы утверждаете, что обнуляемый параметр message не равен нулю, используя !! (оператор утверждения не равным нулю).Если message равно нулю, это приведет к нулевому указателю.

TL; DR: не используйте !!, если вы точно не знаете, что делаете.Почти всегда есть лучший способ.

The !!Оператор

Третий вариант предназначен для любителей NPE : оператор ненулевое утверждение (!!) преобразует любое значение в ненулевой типи выдает исключение, если значение равно нулю.Мы можем написать b !!, и это будет возвращать ненулевое значение b (например, строку в нашем примере) или бросить NPE, если b равно нулю:

val l = b!!.length

Таким образом, , если вы хотите NPE , вы можете получить его, но вы должны явно запросить его, и он не появляется на ровном месте.

0 голосов
/ 06 июня 2018

С документация :

The !!Оператор

Третий вариант предназначен для любителей NPE: оператор утверждения, не равный NULL (!!), преобразует любое значение в ненулевой тип и создает исключение, если значение равно NULL.Мы можем написать b!!, и это вернет ненулевое значение b (например, String в нашем примере) или бросить NPE, если b равно нулю:

val l = b!!.length

Таким образом, если вы хотите NPE, вы можете получить его, но вы должны попросить об этом явно, и он не появляется на ровном месте.

Так что независимоот того, использует ли ваша функция параметр или нет, с помощью message!! вы явно запрашиваете NPE.

0 голосов
/ 06 июня 2018

message: String? указывает, что message может быть или не быть null.

Поскольку ваша функция maybeWriteMessage имеет значение по умолчанию null для message, и вы звоните maybeWriteMessage() без указания message - значение по умолчанию (null) будет использоваться при вызовеwriteMessage(message!!).

Как написано в документации , !! -оператор генерирует исключение, когда значение равно null.

Один из способов запуска writeMessage безопасно будет использовать .let:

fun maybeWriteMessage(message: String? = null) {
    message?.let { nonNullMessage ->
      writeMessage(nonNullMessage)
    }
}
0 голосов
/ 06 июня 2018

Оператор !! выдает KotlinNullPointerException, если message равно нулю.

Вы можете прочитать об этом здесь: https://kotlinlang.org/docs/reference/null-safety.html#the--operator

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...