使用字段覆盖无参数方法时的空指针异常

时间:2014-04-26 15:47:46

标签: scala oop

我正在完成“Scala编程”,它说你可以使用字段覆盖无参数方法,ad给出了以下示例:

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”替换那些也正确运行。我对这个例子不了解什么?

1 个答案:

答案 0 :(得分:2)

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

val在初始化时被评估一次,而def s在每次被访问时被评估。 NullPointerException在初始化期间发生,因为height在尚未初始化时访问contents

根据您的建议,将heightwidth转换为def是防止此问题的一种方法。