0

我只想创建一次演员并一次又一次地在应用程序中使用它的引用。为此,我创建了一个 Scala 对象,一切正常,但是当我尝试使用子演员时,我得到了NullPointerException. 这是代码:

object ActorManager {
  val getTestActorRef: ActorRef = system.actorOf(Props[TestActor], name = "testActor")
}

当我想实例化一个子actor时会出现问题。这是代码:

object ActorManager {
  var context: ActorContext=_

  val getTestActorRef: ActorRef = system.actorOf(Props[TestActor], name = "testActor")

  val getTestChildActorRef: ActorRef = context.actorOf(Props[TestActor], name = "testActor")
}

class ParentTestActor extends Actor {

  ActorManager.context=context

  val childActor = ActorManager.getTestChildActorRef

  def receive ={
    //some code here
  }    
}

实例化时ParentTestActor抛出

java.lang.ExceptionInInitializerError: null

请帮助我如何解决这个问题。

4

1 回答 1

1

您不应该在演员之外分享任何与演员相关的状态。具体来说,您不应该共享特定于 akka 的变量,例如 context、self 等。

应从only父级内部创建子级演员!从父级初始化它们可能是合理的preStart(阅读有关演员生命周期的信息)

如果您需要在静态常量中提供如此多的直接actor ref,请添加child: AtomicReference[ActorRef]您的对象并从父actor 设置它。

于 2018-03-30T14:00:46.337 回答