4

为什么下面的代码会出现空指针异常?

object Test extends App{
    trait MyTrait[A]{ self =>
        val seq: Seq[A]
        val size = seq.size // null pointer here
    }

    val p = new MyTrait[Int]{
        val seq = Seq(1,2,3)
    }
}

如果我将大小字段更改为惰性,那么没关系。

4

2 回答 2

7

字段按照它们混合的顺序进行初始化——所以首先发生特征中的所有事情,然后val分配给Seq(1,2,3)(因为你实际上是在混合匿名特征)。

正如您所发现的,lazy val这通常是摆脱这种混乱的一种方法:在seq.size您需要它之前,您实际上不会调用它,这是在您填充该seq字段之后。

于 2012-09-02T20:30:40.893 回答
6

风格建议是避免 vals 的特性,有利于 defs 和惰性 vals,因为 init order 地雷。

对话示例: https ://groups.google.com/forum/?fromgroups=#!topic/scala-user/nrOrjPOYmb0

于 2012-09-03T06:37:26.463 回答