Что произойдет, если мы передадим данные `null` аннотированному объекту @NonNull? - PullRequest
0 голосов
/ 11 февраля 2019

Я преобразовал свой старый java model класс в котлин data class.Некоторые объекты помечены @NonNull в Java.Мой вопрос: если из моего бэкэнда в моем классе данных будет передано значение null, что произойдет?Может ли использование этого username nullable помочь в предотвращении сбоя, если передано null?

Java-код:

public abstract class Comment(){
@NonNull
public abstract String username();
}

Код Kotlin: (что происходит в этом случае, если передано значение NULL?)

data class Comment(val username: String)

Код Kotlin: (он может обрабатывать значение NULL))

data class Comment(val username: String?)

Ответы [ 2 ]

0 голосов
/ 11 февраля 2019

В java - все скомпилируется и выдаст предупреждение

В kotlin - ваш компилятор не позволит вам передать null в обнуляемый или аннотированный @notnull тип

Например:

public static boolean isUserLoggedIn(@NotNull ctx: Context) {
    return ...
}

// Kotlin Invocation
fun main(args: Array<String>) {
    isUserLoggedIn(null)
}

И ошибка компиляции:

e: C:\_projects\test.kt: (37, 37): Null can not be a value of a non-null type Context
:app:compileDebugKotlin FAILED

FAILURE: Build failed with an exception.

В Java вы можете вызывать этот java-метод без ошибок компиляции, но в вашей IDE должно отображаться предупреждение (передача значения null параметру, аннотированному как @notnull),Кроме того, в Java вы можете передавать нулевые параметры в методы notnull kotlin.Он скомпилирует и выдаст предупреждение.

Kotlin поддерживает некоторые аннотации (например, JetBrains, Android, Eclipse).Полный список можно найти здесь: https://kotlinlang.org/docs/reference/java-interop.html#nullability-annotations

Редактировать 1 - относительно комментария:

Зависит от того, включена проверка нуля во время выполнения или нет.Kotlin, для обеспечения нулевой безопасности в сгенерированном коде добавлен вызов kotlin.jvm.internal.Intrinsics.checkNotNull.

См .: https://github.com/JetBrains/kotlin/blob/master/libraries/stdlib/jvm/runtime/kotlin/jvm/internal/Intrinsics.java

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

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

Посмотрите, как: Отключите не нулевые проверки в Kotlin

0 голосов
/ 11 февраля 2019

Система типов Kotlin сообщает обнуляемый тип из ненулевого типа.Объявление типа x: String? означает, что null разрешено (как в Java)

Объявление x: String означает, что вы не принимаете пустые значения.Компилятор Kotlin позаботится об этом, и он постарается отбросить любой неправильный код, который пытается установить там null.

Компилятор Kotlin распознает аннотации, такие как @Nullable или @NotNull: см. Документацию для получения дополнительной информации.детали https://kotlinlang.org/docs/reference/java-interop.html#nullability-annotations

Конечно, есть способы вызвать метод с нулевым значением, равным null (например, через Java Reflection или просто из другого языка JVM).Чтобы защититься от этого, компилятор Kotlin автоматически генерирует нулевые проверки, и код не будет работать быстро.

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