首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >多态PApplet处理NullPointerException

多态PApplet处理NullPointerException
EN

Stack Overflow用户
提问于 2018-04-25 12:50:22
回答 1查看 219关注 0票数 2

我有一个任务,我必须通过PApplet处理器显示“健身机”和它们的数据。我需要使用多态性和继承(跑步机是一个GymMachine,等等)。每台健身房机器都必须有自己的绘图方法。我就是想不出怎么避免NullPointerException。

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

代码语言:javascript
运行
复制
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类,跑步机将从它派生:

代码语言:javascript
运行
复制
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);
  }
}

为了清楚起见,这里是我的跑步机课程:

代码语言:javascript
运行
复制
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一直在调用自己,因为我需要在某个地方创建一个跑步机实例。我也读到过,我可以让构造函数接受PApplet类型的参数,而不是制作GymMachine extend PApplet,(即GymMachine(PApplet p){...}),但是我不能从这个派生出TreadMill。任何帮助都是非常感谢的。

EN

回答 1

Stack Overflow用户

发布于 2018-04-26 00:14:16

只有一个类应该扩展PApplet类。

可以将PApplet看作是在窗口中运行的整个草图。您只想显示一个窗口,对吧?所以您只需要一个PApplet类。

您不希望每个GymMachine都显示在它自己的窗口中。您希望在一个窗口中绘制多个GymMachines。因此,去掉GymMachine类上的extends PApplet

这样做之后,您将得到一些编译器错误,因为GymMachine类无法识别fill()rect()等函数。要解决这个问题,您需要将主sketch类(扩展PApplet的类)的一个实例传递给辅助sketch类。this关键字在这方面派上了用场。

最后,您必须使用对主PApplet草图的引用来调用处理函数。下面是一个例子:

代码语言:javascript
运行
复制
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);
  }
}

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50014263

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档