2011-08-27 75 views
2

如果我实例化和Base2运行良好为什么下面的Scala代码会抛出NullPointerException?

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 

异常信息:(!不和Base2)

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

请勿重写混凝土瓦尔。这就是疯狂(或者更重要的是,非工作软件)。 –

回答

4

和Base2是初始化此时benchmark.onTrade执行第一,但是该成员benchmark从Base3正在被使用,因为覆盖(Base2中的benchmark实际上是首先初始化的,但没关系,因为其他benchmark被“绑定”到!)。我相当肯定这已与Val为虚拟 ...

Base3的初始化不会启动(或恢复?)和Base2的完成后,直到从而Base3.benchmark仍然是空的benchmark.onTrade做。

FWIW,一个 “懒VAL” 似乎 “解决” 问题。

快乐编码。

1

我不知道斯卡拉,但可能它是这样的:

Base3benchmark例如,直到后Base2benchmark.onTrade)所有的代码并不构成已被执行?

相关问题