2014-12-26 126 views
1

我正在学习scala中并行处理的akka​​框架,并且我试图将一个java项目迁移到scala,因此我可以同时学习akka和scala。当在worker中进行一些计算后尝试从worker actor接收可变对象时,我在主actor上得到一个NullPointerException。所有的代码如下...主演员Scala/Akka NullPointerException

import akka.actor._ 
    import java.math.BigInteger 
    import akka.routing.ActorRefRoutee 
    import akka.routing.Router 
    import akka.routing.RoundRobinRoutingLogic 

    object Main extends App { 

     val system = ActorSystem("CalcSystem") 
     val masterActor = system.actorOf(Props[Master], "master") 
     masterActor.tell(new Calculate, ActorRef.noSender) 
    } 

    class Master extends Actor { 

     private val messages: Int = 10; 
     var resultList: Seq[String] = _ 

     //val workerRouter = this.context.actorOf(Props[Worker].withRouter(new RoundRobinRouter(2)), "worker") 

     var router = { 
     val routees = Vector.fill(5) { 
      val r = context.actorOf(Props[Worker]) 
      context watch r 
      ActorRefRoutee(r) 
     } 
     Router(RoundRobinRoutingLogic(), routees) 
     } 

     def receive() = { 
     case msg: Calculate => 
      processMessages() 
     case msg: Result => 
      resultList :+ msg.getFactorial().toString 
      println(msg.getFactorial()) 

      if (resultList.length == messages) { 
      end 
      } 
     } 

     private def processMessages() { 
     var i: Int = 0 
     for (i <- 1 to messages) { 
     // workerRouter.tell(new Work, self) 
      router.route(new Work, self) 
     } 
     } 

     private def end() { 
     println("List = " + resultList) 
     this.context.system.shutdown() 
     } 
    } 


import akka.actor._ 
import java.math.BigInteger 

class Worker extends Actor { 

    private val calculator = new Calculator 

    def receive() = { 
    case msg: Work => 
     println("Called calculator.calculateFactorial: " + context.self.toString()) 
     val result = new Result(calculator.calculateFactorial) 
     sender.tell(result, this.context.parent) 

    case _ => 
     println("I don't know what to do with this...") 

    } 
} 


import java.math.BigInteger 

class Result(bigInt: BigInteger) { 

    def getFactorial(): BigInteger = bigInt 

} 

import java.math.BigInteger 

class Calculator { 

    def calculateFactorial(): BigInteger = { 

    var result: BigInteger = BigInteger.valueOf(1) 
    var i = 0 

    for(i <- 1 to 4) {  
     result = result.multiply(BigInteger.valueOf(i))  
    }   
    println("result: " + result) 
    result 
    } 
} 

回答

0

您与null初始化​​,然后尝试添加一些东西。

+0

感谢的是固定的,但堆栈跟踪无法指出来 – linuxWiz89