多态性PApplet处理NullPointerException

时间:2018-04-25 04:50:22

标签: java processing

我有一项任务,我必须展示"健身器材"和他们的数据通过PApplet处理器。我需要使用多态和继承(跑步机是GymMachine等)。每台健身器材都必须有自己的抽奖方法。我只是无法弄清楚如何避免NullPointerException。

这是我的" ProcessingExample.java"中的代码。 file,实际通过处理器绘制图像的代码:

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();
  }
}

这是我的GymMachine课程,跑步机将从中导出:

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设为同一个类,因为我认为它可能需要访问&#34;相同的画布,&#34;但问题是ProcessingExample不断调用自己,因为我需要在某处创建一个跑步机的实例。我还读过,而不是制作GymMachine extend PApplet,我可以让构造函数采用PApplet类型的参数,(即GymMachine(PApplet p){...}),但是我无法得到TreadMill从这一点。感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

只有一个类应该扩展dot.exe类。

PApplet视为在窗口中运行的整个草图。你只想要一个窗口出现,对吧?所以你只想要一个PApplet类。

您不希望每个PApplet都显示在自己的窗口中。您希望在一个窗口中绘制多个GymMachine。所以摆脱GymMachines类上的extends PApplet

执行此操作后,您将收到一些编译器错误,因为GymMachine类无法识别GymMachinefill()等函数。要解决此问题,您需要将主草图类(扩展rect()的类)的实例传入辅助草图类。 PApplet关键字可以派上用场。

最后,您必须使用对主this草图的引用来调用Processing函数。这是一个例子:

PApplet

有关详细信息,请参阅this tutorial从非草图类调用处理函数部分。