【问题标题】:Scala NullPointerException unless lazyScala NullPointerException 除非懒惰
【发布时间】:2016-10-07 02:06:21
【问题描述】:
  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 类中。似乎 vals 在评估 instance.main(...) 之前没有初始化。我假设lazy vals 的实现是不同的。

【问题讨论】:

  • 我在 fibs2 评估上没有任何 NPE
  • 这里一样,我在 repl 上运行时没有 NPE

标签: scala nullpointerexception lazy-sequences


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2016-07-24
    • 2012-11-04
    • 2021-08-25
    • 1970-01-01
    • 2017-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-02
    相关资源
    最近更新 更多