Scala::lazy 值除非打印,否则为 null?

标签 scala nullpointerexception lazy-initialization

鉴于特征(简化)

trait A {
  val eventStream: EventStream
  val credentialsStorage = // something here
  val userStorage = // something here
  val crypto = // something here
  ...    
  lazy val authSvc = new CoreAuthentication(credentialsStorage, new AuthenticationProviderResolver, userStorage, eventStream, crypto)
}

class T extends A with TraitProvidingEventStream with FlatSpec with [lot of another traits here] {

  val eventStream = systemFromTraitProvidingEventStream.eventStream

  "This" should "work" in {
    println(authSvc) // this is "magic"
    val user = authSvc.doSomethingWithUser(...);
  }
}

如果我删除标记为//this is "magic"的行,那么我将在下一行得到 NullPointerException,因此 authSvc 为 null。

那里可能出了什么问题?

我无法为此创建干净的小测试用例,通常这效果很好

最佳答案

ML 中曾出现过这样的情况:如果在初始化惰性 val 时抛出异常,则该 val 为 null;但你可以尝试再次初始化,它会神奇地工作。 (也就是说,在第一次尝试初始化失败时,不会设置惰性 val 的“已初始化”位标志。)

我认为 ML 的情况与特征中 vals 的初始化顺序有关,所以也许这就是你的问题。依赖它是非常危险的,因此建议在特征中使用 defs。请参阅 Luigi 对 DelayedInit 的评论。

关于Scala::lazy 值除非打印,否则为 null?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13542394/

相关文章:

java - hibernate 5 : db connections are still not released (idle in transaction) after lazy loading

scala - "missing boundary headers"与 scala play 中的 ws.url

java - Java 中的空指针异常

java - 私有(private)静态属性变量导致空指针异常

Java 基本 GUI 程序收到此错误 "AWT-EventQueue-0"java.lang.NullPointerException”

java - Spring Batch 作业 bean 可以延迟初始化吗?

c# - 在基类的惰性方法中获取继承类名

scala - 使用 scala.math.max 减少 float 组

scala - Seq.map中如何选择输出集合类型?

scala - 如何从TypeTag或同时获取ClassTag的ClassTag?