gpt4 book ai didi

kotlin - requireNotNull 与确定运算符 !!在 Kotlin

转载 作者:行者123 更新时间:2023-12-04 12:39:02 25 4
gpt4 key购买 nike

我们有一个基于 Kotlin 的应用程序,最近我们添加了第三方代码质量工具(Codacy 中的 Detekt)。然而,我们开始面临 UnsafeCallOnNullableType 错误。
我们发现可行的方法是在所有可能为空的参数上添加 requireNotNull 检查。目前,我们正在使用确定运算符 (!!)

我们是否有任何特定的理由或惯例来选择一个而不是另一个。据我所知,两者都会抛出异常并阻塞执行流程,除了一个会抛出 IllegalArgumentException 而另一个会抛出 NullPointerException。

最佳答案

requireNotNull ,假设您指的是 Objects#requireNonNull , 是一个 Java 方法,相当于 !! ,但有一个不同的异常(exception)。
您没有添加任何代码,因此帮助您调试有点困难。您提到了第三方代码质量工具,但没有提到哪个。无意中翻到this GH issue与您遇到的错误相匹配。这也是我能找到的唯一可以在任何时候使用那个确切错误的东西。我可能漏掉了一些,但它涵盖了 Google HitTest 门的热门歌曲,所以我要离开了。
如果您使用的是 Detekt,这是一个已报告的错误。使用 !! IntelliJ 甚至建议。
但是,您可以采用另一种方式。
是的,使用 Objects#requireNonNull是一种选择。不过还有第二个,那就是使用空安全运算符,正如 m0skit0 提到的那样。
这样做的原因是因为如果调用的任何内容为空,则最终结果为空。 IE。这个:

instance.nonNullType.nullable?.nullableChild?.someOtherNullableChild
如果任何可为空的为空,则最终结果为空,并且不会调用其他任何一个。
现在,考虑到这可能是 Detect 中的一个错误,这似乎是目前最简单的解决方法:
whatever.calls.you?.make?.to?.the?.database ?: throw NullPointerException("Something is null");
它还保持变量非空,这意味着您以后不需要空安全调用。 elvis 运算符检查是否有任何内容为空,然后抛出异常。或者,您可以只使用 Objects#requireNotNull :
Objects.requireNonNull(whatever.calls.you.make.to.the.database)
如果你真的需要验证每一步,你只需要在任何地方保持空检查
特尔;博士: !!requireNotNull除了 requireNotNull 之外,它们的工作方式实际上是相同的。是一个方法调用和 !!编译为 if 语句:
if(whatever == null) {
Intrinsics.throwNpe();
}
原因 !!触发器 UnsafeCallOnNullableType是因为 Detekt 中的(可能的)错误。但是,这两个选项都是同一件事的语法糖:如果变量为空,则抛出 NPE。

关于kotlin - requireNotNull 与确定运算符 !!在 Kotlin ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52718086/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com