为什么以下Scala代码会抛出NullPointerException?

时间:2011-08-27 22:35:03

标签: scala

如果我实例化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)
...

2 个答案:

答案 0 :(得分:4)

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

有关

Base3的初始化不会在Base2完成之后开始(或恢复?),因此benchmark的{​​{1}}仍然为空。

FWIW,“懒惰的val”似乎“解决了”这个问题。

快乐的编码。

答案 1 :(得分:1)

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

Base3benchmark)中的所有代码执行完毕之后,才会构建{p> Base2的{​​{1}}实例?