【问题标题】:null pointer exception when overriding a parameterless method with a field使用字段覆盖无参数方法时出现空指针异常
【发布时间】:2014-04-26 15:47:45
【问题描述】:

我正在研究“Scala 中的编程”,它说您可以使用字段覆盖无参数方法,广告给出了以下示例:

abstract class Element {
    def contents: Array[String]
    val height: Int = contents.length
    val width: Int = if (height == 0) 0 else contents(0).length
}

class ArrayElement(conts: Array[String]) extends Element {
    val contents:Array[String] = conts
}

val a = Array("Hello", "mom")
println(a(0))
val x = new ArrayElement(a)
println(x.contents)
println("Hello, " + x.height)

但是,这段代码为我产生了一个空指针异常。用“def contents:”替换“val contents:”可以正常工作。如果内容数组确实被正确传递,我无法真正理解空指针异常的来源。它似乎来自“val height = contents.length”行,因为用“def height”替换那些也可以正确运行。我对这个例子有什么不明白的地方?

【问题讨论】:

标签: scala oop


【解决方案1】:

这是关于抽象类中的评估顺序。

vals 在初始化时被评估一次,而defs 每次被访问时都会被评估。 NullPointerException 发生在初始化期间,因为height 在尚未初始化的时候访问了contents

正如您所建议的,将heightwidth 转换为defs 是防止该问题的一种方法。

【讨论】:

  • 谢谢!那么基类初始化是在子类初始化之前发生的吗?
  • 是的,基类在子类之前初始化
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-03-22
  • 1970-01-01
  • 2017-09-18
  • 2013-01-16
  • 2012-05-31
  • 2014-05-23
  • 2014-11-15
相关资源
最近更新 更多