当前位置: 首页 > 知识库问答 >
问题:

多态PApplet处理NullPointerException

吕华彩
2023-03-14

我有一个作业,我必须通过PApplet处理器显示“健身房机器”和它们的数据。我需要使用多态性和继承(跑步机是体操机,等等)。每个健身房机器必须有自己的绘制方法。我只是想不出如何避免NullPointerException。

这是我的“processingexample.java”文件中的代码,它将通过处理器实际绘制图像:

import processing.core.PApplet;
import processing.core.PImage;

public class ProcessingExample extends PApplet {

  public long start_time;

  public static int canvas_x = 1200;
  public static int canvas_y = 800;

  TreadMill treadmill;
  Stepper stepper;
  Bicycle bicycle;

  public ProcessingExample(){
    start_time = System.currentTimeMillis();
  }

  public void setup(){
    size(canvas_x, canvas_y);
    treadmill = new TreadMill();
    stepper = new Stepper();
    bicycle = new Bicycle();
  }

  public void draw(){
    // treadmill
    treadmill.draw();
  }
}
import processing.core.PApplet;
import processing.core.PImage;

public class GymMachine extends PApplet {
  public long start_time;

  public static int canvas_x = 1200;
  public static int canvas_y = 800;

  public GymMachine(){
    start_time = System.currentTimeMillis();
  }

  public void draw(){ // for now I am just trying to draw the background, a block of color on 1/3 of the canvas
    fill(83, 85, 171);
    rect(0, 0, canvas_x / 3, canvas_y);
  }
}
import processing.core.PApplet;
import processing.core.PImage;

public class TreadMill extends GymMachine {
  private int angleOfInclination;
  private double mph;

  public TreadMill(){
    angleOfInclination = 1;
    mph = 1.0;
    image = "treadmill.png";
  }

  public TreadMill(int i, double m){
    if (i >= 1 && i <= 15){ // data validation
      angleOfInclination = i;
    }
    else { // else, defer to defaults
      angleOfInclination = 1;
    }

    if (m >= 1.0 && m <= 15.0){
      mph = m;
    }
    else {
      mph = 1.0;
    }
  }

  public void setAngleOfInclination(int i){
    if (i >= 1 && i <= 15){ // data validation
      this.angleOfInclination = i;
    }
  }

  public void setMPH(double m){
    if (m >= 1.0 && m <= 15.0){ // data validation
      this.mph = m;
    }
  }

  public long getCaloriesUsed(){
     return 20 *(long) mph + 15 * angleOfInclination;
  }

  public String toString(){
    return "Angle of inclination is " + angleOfInclination + " degrees; Speed is " + mph + " mph; Calories burned: " + this.getCaloriesUsed();
  }
}

在过去的5个小时里,我一直无法弄清楚为什么treadmill.draw()会抱怨NullPointerException。我不太清楚null变量是什么。我试过让ProcessingExample和GymMachine成为同一个类,因为我想它可能需要访问“相同的画布”,但问题是ProcessingExample一直在调用自己,因为我需要在某个地方创建一个treadmill的实例。我还读到,与其让Gymmachine扩展PApplet,我可以让构造函数采用PApplet类型的参数(即Gymmachine(PApplet p){...}),但我无法让Treadmille从中派生。感谢任何帮助。

共有1个答案

邵祺
2023-03-14

只有一个类可以扩展Papplet类。

Papplet视为运行在窗口中的一个整体草图。你只想显示一个窗口,对吧?因此您只需要一个Papplet类。

您不希望每个gymmachine都显示在自己的窗口中。您希望在一个窗口中绘制多个gymmachines。因此,去掉Gymmachine类上的extendsPapplet

public class MySketch extends PApplet{

  Thing thing = new Thing(this);

  public void draw(){
    thing.draw();
  }
}

public class Thing{
  PApplet mainSketch;

  public Thing(PApplet mainSketch){
    this.mainSketch = mainSketch;
  }

  public void draw(){
    mainSketch.ellipse(100, 100, 100, 100);
  }
}

有关更多信息,请参阅本教程的“从非草图类调用处理函数”部分。

 类似资料:
  • 每次编译代码时,我都会收到这样一条消息:“用法:PApplet[options][sketch args]请参阅Javadoc for PApplet以获取解释。”我使用的代码是通过闪存驱动器从我的旧电脑中导入的,在那台电脑上运行时效果良好。当我试图把文件从SRC打开后,把它放在我的工作区,它没有考虑它是一个项目,所以我把它放在一个新的处理项目中。所以基本上我不确定我是否安装了处理错误或者代码中有

  • 问题内容: 我有一个像这样的课程: 我想序列化它们的列表: 当我进行序列化时,动物属性的类型信息将丢失。有没有一种方法可以某种方式安装解析器侦听器,以便在遇到列表中的每个元素时提供正确的类进行反序列化?这就是手动提供描述类类型的字符串的想法。 谢谢 问题答案: Gson项目代码库中的RuntimeTypeAdapter据说可以很好地用于多态序列化和反序列化。我认为我尚未尝试使用它。有关更多信息,请

  • 我有三个从超级类(SensorData)继承的类 我想根据参数将一个json输入转换为其中一个类。我正在尝试使用Jackson StdDeserializer并创建一个自定义的反序列化程序 我的问题是,当我确定映射具体类的正确类型时,映射器再次调用自定义stdDeserializer。所以我需要一种方法来打破循环当我有正确的类型。stacktrace是下一个 输入示例 我只包含stacktrace

  • 问题内容: 我有一个与此类似的类层次结构: 像这样的json输入(我无法改变自己) 我正在像这样用Jackson解析Java中的JSON 我想使用JAVA / Jackson从JSON反序列化类A,B和其他类。JSON中没有嵌入类型信息(并且不能)。我不能在类上使用批注(我不拥有它们),我(相信)我不能使用混合包,因为可能有任意数量的类,例如A和B(混合包不是动态的)。好的是,反序列化代码知道哪个

  • 问题内容: 我用python与selenium结合编写了一个脚本,以从其着陆页中抓取不同文章的链接,并通过跟踪引向其内页的url最终获得每个文章的标题。尽管我在这里解析的内容是静态内容,但我还是使用了selenium来查看它在多处理中的工作方式。 但是,我的意图是使用多处理进行抓取。到目前为止,我知道selenium不支持多处理,但似乎我错了。 我的问题:当使用多处理运行selenium时,如何减

  • 问题内容: 请考虑以下代码: 这给出了输出 但是,我希望它能给 ..因为在调用触发方法时h.id已更改为“ B”。 似乎是在启动单独的进程时创建了主机实例的副本,因此原始主机中的更改不会影响该副本。 在我的项目中(当然,要更详细地说明),主机实例字段有时会更改,并且由在单独的进程中运行的代码触发的事件可以访问这些更改很重要。 问题答案: 多处理在不同的 流程中 运行东西。事物在发送时 不被 复制几