代码之家  ›  专栏  ›  技术社区  ›  Michiel

允许!!当它确定不会抛出NPE时

  •  1
  • Michiel  · 技术社区  · 7 年前

    我正在查看一个pull请求,其中包含 !! -not null断言运算符。应该批准吗?

    可为null的值本身实际上永远不会为null。我想不出比“感觉不对”更好的理由了

    private val hasFinishedSubject = BehaviorSubject.create<Boolean>()
    
    init {
        hasFinishedSubject.onNext(false)
    }
    
    val hasFinishedScanner: Boolean
        get() = hasFinishedSubject.value!!
    

    自 hasFinishedSubject 在施工时初始化, hasFinishedSubject.value 永远不会为空

    可以换成f.i.:

    val hasFinishedScanner: Boolean
        get() = hasFinishedSubject.value ?: false
    

    但这个错误是多余的,也可能导致错误。什么是最干净的?

    0 回复  |  直到 7 年前
        1
  •  0
  •   Eugene Petrenko    7 年前

    Kotlin编译器尊重Java的可空性注释,例如。 @Nullable 或 @NotNull 来自JSR-305或intelliJ。 https://kotlinlang.org/docs/reference/java-interop.html#nullability-annotations

    将这些注释包含到 BehaviorSubject 如果你能控制的话。

    另一方面,Kotlin中有一些平台类型,用于简化Java互操作中的可空性检查。 https://kotlinlang.org/docs/reference/java-interop.html#null-safety-and-platform-types

    在我看来,使用 !! 应该避免使用Kotlin代码,在Kotlin中有足够的方法使代码可以为null。

    对于Java互操作-这可能会发生。但不是用 !! 你可以用一些更有意义的东西,比如你上面的建议。

    我可能会写下这样的话:

    val hasFinishedScanner: Boolean
        get() = hasFinishedSubject.value ?: error("No value")
    

    在这里 error 函数具有返回类型 Nothing ,实际上,它抛出了一个异常。