除非是懒惰,否则Scala NullPointerException

时间:2016-10-07 02:06:22

标签: scala nullpointerexception lazy-sequences

  def fix[A, B](fn : Function2[Function1[A, B], A, B]) : Function1[A, B] =
    (x : A) => fn(fix(fn), x)

  lazy val fibs1 = fix[(Int, Int), Stream[Int]](
    (fn, a) => a._1 #:: fn((a._2, a._1 + a._2))
  )

  val fibs2 = fix[(Int, Int), Stream[Int]](
    (fn, a) => a._1 #:: fn((a._2, a._1 + a._2))
  )

在学习Scala时遇到了一个奇怪的错误。为什么fibs1((1,1))不产生错误,而fibs2((1, 1))给出空指针异常?

编辑:

此代码位于App类中。似乎valinstance.main(...)被评估之前未初始化。我假设lazy val的实现是不同的。

1 个答案:

答案 0 :(得分:0)

你是对的。一些val没有被初始化,但是因为你把它变成了一个懒惰的val,它只在需要的时候进行了评估,当时它已经被一些你无法控制的代码初始化了