0

我最近一直在处理一个处理项目,并希望将它带入 Eclipse(与另一个用 Java 编写的类一起使用)。基本上这个项目是一个比赛模拟,我有一个包含 main()、setup() 和 draw() 的 TheRace 类,一个包含用于迭代比赛本身的所有代码的 Race 类,一个 Racer 类和扩展 Racer 的三个不同类别(不同类型的赛车手)。我已经导入了 core.jar 文件,并且没有语法错误(代码编译),但是当我运行代码时,我得到了这个错误:

Exception in thread "Animation Thread" java.lang.NullPointerException
at processing.core.PApplet.noStroke(PApplet.java:13845)
at Stepper.drawRacer(Stepper.java:15)
at Race.run(Race.java:29)
at TheRace.draw(TheRace.java:60)
at processing.core.PApplet.handleDraw(PApplet.java:2266)
at processing.core.PGraphicsJava2D.requestDraw(PGraphicsJava2D.java:243)
at processing.core.PApplet.run(PApplet.java:2140)
at java.lang.Thread.run(Thread.java:662)

这是错误开始的 Stepper 类:

import processing.core.PApplet;

public class Stepper extends Racer {

    PApplet parent = new PApplet();

    Stepper(String name, int loc, int ypos, PApplet p) {
        super(1, name, loc, ypos,p);
    }

    public void move() {
        location += speed;
    }

    public void drawRacer(int size, int finish) {
        parent.noStroke();
        parent.fill(242,109,125);
        parent.rect((location*(1000-size*2))/finish, ypos, size, size);
    }
}

构造函数包含名称、比赛沿线位置、车道位置和根据http://processing.org/learning/eclipse/所需的 PApplet 参数的参数。错误从 开始parent.noStroke();,但不是唯一的noStroke(),因为我尝试对其进行评论,但错误只是在下一行出现。我感觉这个错误与我使用 PApplet 的方式有关,但我不知道是什么。

编辑:所以我从我认识的人那里得到了意见,显然问题是我没有使用正确的 PApplet 父级。这是 Stepper 扩展的 Racer 类:

import processing.core.*;

public class Racer{
  int location;
  int speed;
  String name;
  int ypos;
  PApplet parent;// = new PApplet();

  Racer (int initspeed, String nema, int loc, int yposi, PApplet p) {
    location = loc;
    speed = initspeed;
    name = nema;
    ypos = yposi;
    parent = p;
  }

  public PApplet getParent() {
    return parent;
  }
...

根据这个人的说法,在 Racer 类和 Stepper 类中都声明 PApplet 父级是错误的,而是在 Stepper 类的构造函数中从 Racer 类调用 PApplet。然而,令我困惑的是:如果 parent 只在 Racer 中声明过,Stepper 类引用了 Racer 类,而我从不告诉 Racer 类使用哪个 PApplet(即扩展 PApplet 的 TheRace 类),然后Racer 课程如何知道要使用哪个 PApplet?

提前致谢。

4

1 回答 1

0

问题是您在 Stepper 中创建了一个新的 PApplet(可能在您拥有的任何其他子类中)。你只能有一个 PApplet 实例,我假设它是你的 TheRace 类(它扩展了 PApplet 并实现了设置和绘制)。

因此,您需要将该实例传递给应该可以访问 Papplet 方法的类。这就是您似乎已经在 Racer 中所做的事情。但只需删除子类中的 PApplet 父变量(此处为:Stepper),就可以了。

关于您的编辑:您可以从子类(Stepper)中的超类(此处:Racer)访问非私有变量。

于 2014-02-25T14:14:39.507 回答