scala - 使用字段覆盖无参数方法时出现空指针异常

标签 scala oop

我正在学习“Programming in 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)

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

最佳答案

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

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

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

关于scala - 使用字段覆盖无参数方法时出现空指针异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23313143/

相关文章:

Scala特征和结构类型: can a trait extend a structural type and then call super?

c++ - 使用基于 IOCP 的客户端的每个 IO 数据

c++ - 在 C++ 中调用辅助类的重写方法

scala - 被 "...extends Function1[Int, Int]"弄糊涂了

java - 如何在 Java 中扩展不可变类型

c# - 多态基础

c++ - 成员函数与非成员函数?

orm - Morphia 用于 Scala

scala - 下载异常 : sun. security.validator.ValidatorException:未找到受信任的证书

scala - 为什么在 val 变量上使用 += 和 a=x+y 时会出现不同的错误消息?