【问题标题】:Why does the following Scala code throw a NullPointerException?为什么以下 Scala 代码会抛出 NullPointerException?
【发布时间】:2011-08-28 09:16:19
【问题描述】:

如果我实例化 Base2 它运行良好

class Base2 {

  class Benchmark {
    def onTrade() {
      println("base onTrade")
    }
  }

  protected val benchmark = new Benchmark
  benchmark.onTrade
}

class Base3 extends Base2 {

  override val benchmark = new Benchmark {
    override def onTrade() {
      println("sub onTrade")
    }
  }
}

// to run
new Base3

异常信息:

java.lang.NullPointerException
    at Base2.<init>(<console>:16)
    at Base3.<init>(<console>:19)
    at .<init>(<console>:10)
    at .<clinit>(<console>)
    at .<init>(<console>:11)
...

【问题讨论】:

  • 不要覆盖具体的 vals。这就是疯狂(或者,更确切地说,是不工作的软件)。

标签: scala


【解决方案1】:

Base2 首先初始化,此时benchmark.onTrade 被执行,但是来自Base3 的成员benchmark(不是Base2!)由于覆盖而被使用(Base2 中的benchmark 是实际上首先初始化,但这并不重要,因为另一个 benchmark 被“绑定”到!)。我相当肯定这与 val 是 virtual...

有关

Base3 的初始化在 Base2 完成之前不会开始(或恢复?),因此 Base3.benchmarkbenchmark.onTrade 处仍然为空。

FWIW,“惰性验证”似乎可以“解决”问题。

编码愉快。

【讨论】:

    【解决方案2】:

    我不知道 scala,但它可能是这样的:

    Base3benchmark 实例是在Base2 (benchmark.onTrade) 中的所有代码都执行完毕后才构造的?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-25
      • 2013-11-13
      • 1970-01-01
      • 2014-12-18
      • 2014-07-01
      • 1970-01-01
      相关资源
      最近更新 更多