Scala Akka NullPointerException错误 [英] Scala Akka NullPointerException error

查看:99
本文介绍了Scala Akka NullPointerException错误的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个 Boot 类和一个 Drawer 演员。因此,当我按下按钮时,我会使用参数调用Starter。在抽屉演员中,我得到 Starter 并说要自叫填充。我想填充矩形,但是当我调用 Fill 时,出现错误:null
java.lang.NullPointerException

I have a Boot class and Drawer actor. So when I press button, I call Starter with parameters. In Drawer actor I'm getting Starter and say to self call Fill. I want to fill rectangle, but when I call Fill, I get an error: null java.lang.NullPointerException. How to solve this problem?

启动类:

import akka.actor.{Actor, ActorSystem, Props}
import javafx.application.Platform
import scalafx.Includes._
import scalafx.application
import scalafx.application.JFXApp
import scalafx.scene.Scene
import scalafx.scene.canvas.Canvas
import scalafx.scene.control.Alert.AlertType
import scalafx.scene.control.{Alert, ButtonType}

object Boot extends JFXApp {

  private val system = ActorSystem("MYsystem")
  private val drawer = system.actorOf(Props(new Drawer(g)), "Drawer")

  val wiDth = 500
  val heiDth = 500
  val canvas = new Canvas(wiDth, heiDth)
  val g = canvas.graphicsContext2D

  private val alert = new Alert(AlertType.Information) {
    title = "Hello Player"
    headerText = "Do you want to start game?"
    contentText = null
    buttonTypes = Seq(ButtonType.Cancel, ButtonType.OK)
  }

  private val result = alert.showAndWait()

  result match {
    case Some(ButtonType.OK) => drawer ! Drawer.Starter(50,50)
    case Some(ButtonType.Cancel) => Platform.exit()
  }

  canvas.setFocusTraversable(true)

  new application.JFXApp.PrimaryStage {
    title = "Tanks"
    scene = new Scene(wiDth, heiDth) {
      content = canvas
    }
  }
}

抽屉演员

import akka.actor.{Actor, ActorLogging, ActorRef}
import javafx.scene.canvas.GraphicsContext

object Drawer{
  case object DrawBullet
  case class Starter(x:Int,y:Int)
  case class Fill( x:Int, y:Int)
}

class Drawer(g:GraphicsContext) extends Actor with ActorLogging {
  import Drawer._

  override def receive: Receive = {

    case Starter(newx,newy)=>
      self ! Fill(newx,newy)

    case Fill(newx,newy) =>
      g.fillRect(newx,newy,50,50)
  }
}


推荐答案

您的问题称为转发参考-您在初始化之前使用 g

Your problem is called "forward reference" - you are using g before you've initialized it.

下面的代码复制了此代码。

Below code reproduces this.

import akka.actor.{Actor, ActorLogging, ActorRef}
import akka.actor.{Actor, ActorSystem, Props}
import stackoverflow.Drawer.{Fill, Starter}

object AcalaAkkaNPE_51853920 extends App {
  def aFunctionThatCreatesG() = new G()


  private val system = ActorSystem("MYsystem")
  private val drawer = system.actorOf(Props(new Drawer(g)), "Drawer")

  drawer ! Fill(5,2)

  val g = aFunctionThatCreatesG()

}

object Drawer{
  case object DrawBullet
  case class Starter(x:Int,y:Int)
  case class Fill( x:Int, y:Int)
}

class Drawer(g:G) extends Actor with ActorLogging {
  override def receive: Receive = {

    case Starter(newx,newy)=>
      self ! Fill(newx,newy)

    case Fill(newx,newy) =>
      println(g)
  }
}

class G {
  override def toString: String = "I'm G"
}

这篇关于Scala Akka NullPointerException错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆