重构从主类创建PGraphics的ArrayList到单独的类时的空指针异常

时间:2013-06-28 23:18:42

标签: java eclipse processing pgraphics

我正在使用Eclipse在Java中编写Processing Applet。当我重构一个方法来从主类创建一个PGraphics的ArrayList到一个单独的类时,我一直得到一个空指针异常。所有在主类中编写的方法都工作(下面的第一个代码示例),它是不工作的重构(第二对代码示例)。我已经搜遍了一些答案(一些类似但没有匹配),并进行了大量的重写,但没有骰子。看看,并提前感谢您的帮助:

此代码(所有在一个类中)有效:

package tester;

import java.util.ArrayList;
import processing.core.*;

public class GraphicsMain extends PApplet{
int screenWidth = 800;
int screenHeight = 500;
String filepath = "/a/filepath/here/";
ArrayList<PGraphics> motifArray = new ArrayList<PGraphics>();
int stageWidth = 100; // eventually make this based on the motif's max width
int stageHeight = 400; // make this based on the motif's max height
PImage pic = loadImage(filepath + "small_jones6.png");
PImage pic2 = loadImage(filepath + "small_dresser10.png");


public void setup() {
    size(screenWidth,screenHeight,P3D);
    background(255);

    for (int i = 0; i < 2; i++) {
        motifArray.add(createGraphics(stageWidth,stageHeight,P3D));
        motifArray.get(i).beginDraw();
        motifArray.get(i).image(pic,10,10,100,90);
        motifArray.get(i).image(pic2,10,50,50,50);
        motifArray.get(i).endDraw();            
    }

    if (motifArray.get(0) == null) {
        System.out.println("The motif array is unfilled!");
    }
}

public void draw() {
    for (int i = 0; i < motifArray.size(); i ++) {
        image(motifArray.get(i),200+(400*i),100);

    }

}

static public void main(String[] passedArgs) {
    String[] appletArgs = new String[] { "GraphicsMain" };
    if (passedArgs != null) {
        PApplet.main(concat(appletArgs, passedArgs));
    } else {
        PApplet.main(appletArgs);
    }
}

}

下面的代码(重构为两个单独的类)不会:

**我注意到空指针异常

中标识的两行[每个类中有一行]

第1课:

package tester;

import java.util.ArrayList;
import processing.core.*;

public class GraphicsMain extends PApplet{
int screenWidth = 800;
int screenHeight = 500;
PGraphicsMaker pgm = new PGraphicsMaker(this);
ArrayList<PGraphics> motifArray;

public void setup() {
    size(screenWidth,screenHeight,P3D);
    background(255);

    motifArray = pgm.makeMotifArray(); // ** NULL POINTER EXCEPTION HERE **

    if (motifArray.get(0) == null) {
        System.out.println("The motif array is unfilled!");
    }
}

public void draw() {
    for (int i = 0; i < motifArray.size(); i ++) {
        image(motifArray.get(i),200+(400*i),100);

    }


}

static public void main(String[] passedArgs) {
    String[] appletArgs = new String[] { "GraphicsMain" };
    if (passedArgs != null) {
        PApplet.main(concat(appletArgs, passedArgs));
    } else {
        PApplet.main(appletArgs);
    }
}

}

第2课:

package tester;

import java.util.ArrayList;
import processing.core.PApplet;
import processing.core.PGraphics;
import processing.core.PImage;
import processing.core.*;

public class PGraphicsMaker {
String filepath = "/a/filepath/here/";
PApplet parent;
int stageWidth = 100; // eventually make this based on the motif's max width
int stageHeight = 400; // make this based on the motif's max height
ArrayList<PGraphics> motifArray;
PImage pic;
PImage pic2;

public PGraphicsMaker(PApplet pa) {
    PApplet parent = pa;
    pic = parent.loadImage(filepath + "small_jones6.png");
    pic2 = parent.loadImage(filepath + "small_dresser10.png");
}

public ArrayList makeMotifArray() {
    ArrayList<PGraphics> motifArray = new ArrayList<PGraphics>();
    for (int i = 0; i < 2; i++) {
            // ** NULL POINTER EXCEPTION on the line below **
       motifArray.add(parent.createGraphics(stageWidth,stageHeight,parent.P3D));
       motifArray.get(i).beginDraw();
       motifArray.get(i).image(pic,10,10,100,90);
       motifArray.get(i).image(pic2,10,50,50,50);
       motifArray.get(i).endDraw();
    }
    return motifArray;
}
}

任何帮助都会很棒。谢谢!

1 个答案:

答案 0 :(得分:3)

PGraphicsMaker的构造函数中,您声明了一个局部变量parent并为其指定了pa

PApplet parent = pa;

...当我确定您打算将其分配给实例变量 parent时:

parent = pa;

在您的代码中,实例变量parent保持null直到被访问,并且NullPointerException结果。