Scala:误用特征,给出了运行时错误

时间:2015-05-25 09:33:02

标签: scala traits

对于广泛的主题感到抱歉;我只是不太确定我做错了什么。

我有一个班级结构

trait BaseType {
  val property: String
}

trait MiddleTrait extends BaseType {
  val myProperty = property.length.toString
  def userProperty() = {
    myProperty
  }
}

object Top extends MiddleTrait {
  val property = "value given here"
}  

哪个编译;但遇到运行时错误 - java.lang.RuntimeException: java.lang.NoClassDefFoundError: Could not initialize class controllers.test.Top$

将MiddleTrait更新为def myProperty = property.length.toString它运行正常。

我希望更好地理解这背后的理论,以便我可以预测错误而不会在运行时首先看到它失败

由于

1 个答案:

答案 0 :(得分:0)

当我将代码粘贴到Scala 2.11.6 REPL中时,我首先没有收到任何错误。尝试访问myProperty会产生NullPointerException

scala> Top.myProperty
java.lang.NullPointerException
  at MiddleTrait$class.$init$(<console>:12)
  ... 35 elided

引发NullPointerException因为MiddleTraitTop之前被初始化,此时property仍为nullsee spec on template evaluation)。如果您将myProperty转换为函数,则错误消失,因为在完全初始化的Top上调用该函数。

当我尝试在myProperty

之后再次访问NullPointerException时,我引用的错误就出现了
scala> Top.myProperty
java.lang.NoClassDefFoundError: Could not initialize class Top$
  ... 33 elided