2011-08-27 103 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)所有的代碼並不構成已被執行?

相關問題