我已经将原来的 ./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)
答案 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
调用。
如果value为null,将引发NPE。因此,每次传递null时都会抛出NPE。每次,即使您的代码可以处理空值。
但是,您可以禁用此检查。然后,您的代码将变得更轻巧,并且每次传递null时也不会引发异常。但是,您将由于无效安全性而损失很多利润,这也表明您的设计中有不好的地方。