2013-06-28 2 views
1

Я пишу обработчик аппроксимации в Java с помощью Eclipse. Я получаю исключение нулевого указателя, когда я реорганизую метод для создания ArrayList из PGraphics из основного класса в отдельный класс. Метод, написанный в основном классе, работает (первый пример кода ниже), это не работает рефактор (вторая пара образцов кода). Я искал для всего ответа (некоторые похожие, но не совпадающие) и сделал много перезаписи, но не кубиков. Посмотрите, и вид спасибо заранее за вашу помощь:Исключение нулевого указателя при реорганизации создания ArrayList из PGraphics из основного класса в отдельный класс

Этот код (все в одном классе) работает:

package tester; 

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

public class GraphicsMain extends PApplet{ 
int screenWidth = 800; 
int screenHeight = 500; 
String filepath = "https://stackoverflow.com/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 = "https://stackoverflow.com/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; 
} 
} 

Любая помощь будет сказочным. Благодаря!

ответ

3

В вашем конструкторе для PGraphicsMaker вы объявляете локальную переменную parent и назначаете ей pa.

PApplet parent = pa; 

... когда я уверен, что вы хотели, чтобы назначить его экземпляр переменнойparent:

parent = pa; 

В коде переменной экземпляра parent остается null до Доступ к нему, и a NullPointerException результаты.

+0

Спасибо --- простая ошибка, которая ускользала от меня в течение нескольких часов! – gromiczek