对于广泛的主题感到抱歉;我只是不太确定我做错了什么。
我有一个班级结构
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
它运行正常。
我希望更好地理解这背后的理论,以便我可以预测错误而不会在运行时首先看到它失败
由于
答案 0 :(得分:0)
当我将代码粘贴到Scala 2.11.6 REPL中时,我首先没有收到任何错误。尝试访问myProperty
会产生NullPointerException
scala> Top.myProperty
java.lang.NullPointerException
at MiddleTrait$class.$init$(<console>:12)
... 35 elided
引发NullPointerException
因为MiddleTrait
在Top
之前被初始化,此时property
仍为null
(see spec on template evaluation)。如果您将myProperty
转换为函数,则错误消失,因为在完全初始化的Top
上调用该函数。
当我尝试在myProperty
NullPointerException
时,我引用的错误就出现了
scala> Top.myProperty
java.lang.NoClassDefFoundError: Could not initialize class Top$
... 33 elided