如果我们将`null`数据传递给@NonNull注释对象,会发生什么?

时间:2019-02-11 12:12:33

标签: android kotlin

我已经将原来的 ./gradlew -q dependencies app:dependencies --configuration implementation 类转换为Kotlin java model。在Java中,某些对象用@NonNull注释。我的问题是,如果从数据类的后端传递null,将会发生什么?如果通过data class,使此username可为空可以帮助防止崩溃吗?

Java代码:

null

科特琳代码:(如果传递null,在这种情况下会发生什么?)

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

科特琳代码:(可以处理null)

data class Comment(val username: String)

2 个答案:

答案 0 :(得分:1)

Kotlin类型系统从不可为空的类型告诉可为空的类型。像x: String?这样的声明表示允许null(与Java中的相同)

声明x: String表示您不接受空值。 Kotlin编译器会处理此问题,它将尝试最好丢弃任何不正确的代码,然后尝试在此处设置null

Kotlin编译器可以理解@Nullable@NotNull之类的注释:有关详细信息,请参阅文档 https://kotlinlang.org/docs/reference/java-interop.html#nullability-annotations

当然,有多种方法可以调用具有null值的nunnullable方法(例如,通过Java Reflection或仅从另一种JVM语言)。为了避免这种情况,Kotlin编译器会自动发出空检查,并且代码将快速失败。

答案 1 :(得分:0)

在Java中-一切都会编译并发出警告

在Kotlin中-您的编译器不允许您将null传递给可为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中,您可以将null参数传递给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

如果value为null,将引发NPE。因此,每次传递null时都会抛出NPE。每次,即使您的代码可以处理空值。

但是,您可以禁用此检查。然后,您的代码将变得更轻巧,并且每次传递null时也不会引发异常。但是,您将由于无效安全性而损失很多利润,这也表明您的设计中有不好的地方。

了解如何:Disable not null checks in Kotlin