Scala Akka NullPointerException错误 [英] Scala Akka NullPointerException error
本文介绍了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屋!
查看全文