【问题标题】:Kotlin Incorrect null check warningKotlin 不正确的空检查警告
【发布时间】:2018-11-26 21:33:04
【问题描述】:
class A
{
    val b:B
    val at:String
    init
    {
        b=B(this)
        at="A's text"
    }
}

class B(a:A)
{
    val bt:String
    init
    {
        bt= if(a.at!=null) a.at.replaceFirst("A's","B's") else "else's text"
    }

}

这段代码会产生警告

条件 'a.at!=null' 始终为 'true'

但实际上条件 'a.at!=null' 始终为假。

【问题讨论】:

  • a.at 的类型是String,它是非空的(提示:String? 是可空的,String 是非空的)。那么“它总是错误的”是什么意思?
  • 即使a.at 不为空,条件a.at!=null 也将始终为假。检查此代码的输出link
  • 哦,你的意思是这个。结果取决于顺序。如果class A 的init 中的两行交换,那么结果将是预期的。不知道这是不是语法分析的bug。
  • 有什么特别的原因为什么你在init块中初始化所有属性而不是就地?虽然这不会影响这个问题。

标签: kotlin


【解决方案1】:

这已在 3 年前以KT-10455 的形式报道过,“Kotlin 允许在初始化之前使用类成员,导致运行时异常,包括非空类型上的 NPE”。

对于临时修复,您可以将init 中的两行交换为class A,确保在使用前定义A.at。

class A
{
    val b:B
    val at:String
    init
    {
        at="A's text"
        b=B(this)
    }
}

【讨论】:

    【解决方案2】:

    首先你需要初始化变量at然后b:

    class A
    {
        val b:B
        val at:String
        init
        {
            at="A's text"
            b=B(this)
    
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2017-06-26
      • 1970-01-01
      • 2021-06-08
      • 2016-07-02
      • 1970-01-01
      • 1970-01-01
      • 2018-11-13
      • 2022-11-17
      • 2022-12-09
      相关资源
      最近更新 更多