java.lang.NullPointerException 在处理中具有自定义 class

java.lang.NullPointerException with a custom class in Processing

好吧,我是编程新手,所以我的基础知识不是很清楚(我的英语也很糟糕)。当我开始这段代码时,我想让它画一些点,让它们移动,如果它们之间的距离比 X 近,则画一条线。但我想让它变得更复杂一点,然后添加另一个 class,目的是不与另一个 class 交互并画一个圆和旁边的一些,限制在一个矩形内(我试图将它们限制在一个圆圈内,但……现在对我来说太多了)。好吧,问题是我认为代码是“"clear"”,至少对于 PC 来说是这样,我不知道为什么我会收到这个 "java.lang.NullPointerException" 错误,因为它没有显示我哪里出错了。

任何帮助将不胜感激。

//Test nº1. An array of spheres which are randomly moving, connected between them if the distance is less than 50p.
//The spheres' starting position are determined by the red(x) and green(y) color space from colordata from images.


int[] tots = {#2d2a33, #8e8397, #160e19, #8263a9, #0f1723, #737a86, #2d2a33, #8e8497, #15101c, #965555, #1a2940, #9b7873, #080b12, #272b41, #211f33, #8b6659,
            #070719, #4c5985, #423444, #9c8696, #1a2d13, #799078, #30160e, #da9c7b, #2c2e3a, #6d798e, #28474f, #b63f10, #040c1a, #cf6c24, #442036, #a87d99,
            #19191a, #756d6e, #1a2828, #94b1a2, #060c15, #6d98c1, #284062, #9ab9be, #121720, #abb7c5, #6e6b9b, #282033};

//--Malla--

float xo, yo;

int numMalla = 200;

Malla[] ma = new Malla [numMalla]; 

float x;
float y;
float angle = 0.0; // Direction of motion  
//float speed = random(0.2, 0.8); // Speed of motion

float diameter = 0.0;

//----

//--Errant--

int numPiEr = 10;
int e;

float xoEr = width/2;
float yoEr = height/2;
float xoPiEr = xoEr;
float yoPiEr = yoEr;
float cRotO = 0;

Errant ccEr;
//Errant clEr;
Errant[] piEr = new Errant [numPiEr];
//----

void setup() {
//--Malla--
//coords mapping into the original position
xo = map( (tots[int(random(0,tots.length))]& 0xFF0000)>>16, 0, 255, 0, width);
yo = map( (tots[int(random(0,tots.length))]& 0x00FF00)>>8, 0, 255, 0, height);
//----  

size(1024, 768,P2D);
background(0);
smooth();
frameRate(25);
//float rad = random(5.0,150.0);

//--Malla--
for (int i = 0; i < ma.length; i++) {
ma[i] = new Malla(random(10,width-10),random(10,height-10),angle);

}
//----
//--Errant--

Errant ccEr = new Errant (xoEr, yoEr, cRotO);
//Errant clEr = new Errant (xoEr, yoEr, cRotO);

for (int e = 0; e < piEr.length; e++) {
  piEr[e] = new Errant(xoPiEr, yoPiEr, cRotO);
}

//----

}


void draw() {

  background(0);

  for (int i = 0; i < ma.length; i++) {
    ma[i].maMove();
    for (int j = i + 1; j < ma.length; j++) {
      if (ma[i].nearAnotherMalla(ma[j])) {
        ma[i].highlight();
      }
    }
    ma[i].display();
  } 

  for (int e = 0; e < piEr.length; e++) {
    piEr[e].piErMove();
    piEr[e].piErDisplay();

  }
  ccEr.erMove();
  ccEr.errDisplay();
}



class Malla {

float x,y;
float diameter;
float speedX, speedY;
float angle;
//int temps;
//color c = color(255);
Malla[] nearMalla = new Malla[numMalla];

//----

  Malla(float xpos, float ypos, float dir) {

  xo = x;
  yo = y;

  x = xpos;
  y = ypos;
  //speedX = random(-0.2, 0.2);
  //speedY = random(-0.2, 0.2);
  speedX = random(-2, 2);
  speedY = random(-2, 2);
  //temps=0;
  //diameter = random(5, 13);
  diameter = 2.5;
  angle = dir;

}

//----

void maMove() {

 /*  if(temps==10){
  speedX = random(-2, 2);
  speedY = random(-2, 2);
  temps=0;
   }
   ++temps;*/

   if(x+diameter >= width+20) {
      speedX = -speedX;
    }  
    else if(x+diameter <= -20) {
      speedX = -speedX;
    }

    if(y+diameter >= height+20) {
      speedY = -speedY;  
    }
    else if(y+diameter <= -20) {
       speedY = -speedY;
    }

    // angle += random(-0.13, 0.13);
/* x += speedX;
 y += speedY;*/

     angle += random(-0.13, 0.13);

    x += cos(angle) * speedX;
    y += sin(angle) * speedY; 
}

//----

void highlight() {
  //c = color(255,100);
  stroke(255,1);
  for (int i = 0; i < ma.length; i++) {
  if (nearMalla[i] != null) {

    line(x, y, nearMalla[i].x, nearMalla[i].y);
  }
}
 }

//----

void display() {
  //stroke(c);
  noStroke();
  //noFill();
  fill(255);
  ellipse(x,y,diameter,diameter);
  //c = color(0);
}

//----

 boolean nearAnotherMalla(Malla b) {
   boolean near = dist(x,y,b.x,b.y) <= 60;
    for (int i = 0; i < ma.length; i++) {
   if (near) {
       nearMalla[i] = b;
   } 
   else {
     nearMalla[i] = null;
   }
   }
   return near;

 }
}

这是行不通的,单个对象

class Errant {

  float xEr, yEr, xPiEr, yPiEr, cRot, velEr, velErX, velErY, velPiEr,  velPiErX, velPiErY;
  int ccDiam, clDiamX, clDiamY, piErDiam;


  Errant[] nearPiEr = new Errant[numPiEr];

  //----

  Errant(float xEr, float yEr, float cRot) {

    ccDiam = 15;
    clDiamX = 80;
    clDiamY = 70;

    xEr = xoEr;
    yEr = yoEr;

    xPiEr = random((xEr-20),(xEr+20));
    yPiEr= random((yEr-20), (yEr+20));

    cRot = cRotO;

    velEr = random(-3,3);
    velEr = velErX = velErY;
    velPiEr = random(-1.5,1.5);
    velPiEr = velPiErX = velPiErY;
  }


  void erMove() {

    if(xEr+clDiamX >= width+100) {
      velErX = -velErX;
    }  
    else if(xEr+clDiamX <= -100) {
      velErX = -velErX;
    }

    if(yEr+clDiamX >= height+100) {
      velErY = -velErY;  
    }
    else if(yEr+clDiamX <= -100) {
       velErY = -velErY;
    }

    cRot += random(-0.2,0.2);
    xEr = cos(cRot)*velEr;
    yEr = sin(cRot)*velEr;

  }

  void piErMove() {

    if(xPiEr >= xEr+clDiamX) {
      velErX = -velPiErX;
    }  
    else if(xPiEr <= xEr-clDiamX) {
      velErX = -velPiErX;
    }

    if(yPiEr >= yEr+clDiamY) {
      velErY = -velPiErY;  
    }
    else if(yPiEr <= xEr-clDiamY) {
       velErY = -velPiErY;
    }

    xPiEr = cos(cRot)*velPiEr;
    yPiEr = sin(cRot)*velPiEr;

  }

  void errDisplay () {
    noStroke();
    fill(#EFE4B0, 70);

    ellipse(xEr, yEr, 10, 10);
  }

  void piErDisplay () {
    fill(#EFC6B0, 50);

    ellipse(xPiEr, yPiEr, 1, 1);
  }

}

提前致谢,girald0。

这是我在控制台中收到的错误消息:

java.lang.RuntimeException: java.lang.NullPointerException
    at com.jogamp.common.util.awt.AWTEDTExecutor.invoke(AWTEDTExecutor.java:58)
    at jogamp.opengl.awt.AWTThreadingPlugin.invokeOnOpenGLThread(AWTThreadingPlugin.java:103)
    at jogamp.opengl.ThreadingImpl.invokeOnOpenGLThread(ThreadingImpl.java:206)
    at javax.media.opengl.Threading.invokeOnOpenGLThread(Threading.java:172)
    at javax.media.opengl.Threading.invoke(Threading.java:191)
    at javax.media.opengl.awt.GLCanvas.display(GLCanvas.java:541)
    at processing.opengl.PJOGL.requestDraw(PJOGL.java:688)
    at processing.opengl.PGraphicsOpenGL.requestDraw(PGraphicsOpenGL.java:1651)
    at processing.core.PApplet.run(PApplet.java:2256)
    at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.NullPointerException
    at punts_moviment_mapejats2.draw(punts_moviment_mapejats2.java:111)
    at processing.core.PApplet.handleDraw(PApplet.java:2386)
    at processing.opengl.PJOGL$PGLListener.display(PJOGL.java:862)
    at jogamp.opengl.GLDrawableHelper.displayImpl(GLDrawableHelper.java:665)
    at jogamp.opengl.GLDrawableHelper.display(GLDrawableHelper.java:649)
    at javax.media.opengl.awt.GLCanvas.run(GLCanvas.java:1289)
    at jogamp.opengl.GLDrawableHelper.invokeGLImpl(GLDrawableHelper.java:1119)
    at jogamp.opengl.GLDrawableHelper.invokeGL(GLDrawableHelper.java:994)
    at javax.media.opengl.awt.GLCanvas.run(GLCanvas.java:1300)
    at java.awt.event.InvocationEvent.dispatch(Unknown Source)
    at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
    at java.awt.EventQueue.access0(Unknown Source)
    at java.awt.EventQueue.run(Unknown Source)
    at java.awt.EventQueue.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain.doIntersectionPrivilege(Unknown Source)
    at java.awt.EventQueue.dispatchEvent(Unknown Source)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.run(Unknown Source)

Processing 首先运行 sketch() 方法,然后连续运行 draw() 方法。如果您不想根据我对您的问题的评论深入研究实际的 .java 源代码,您可以开始在设置中评论内容并绘图,直到您的草图再次运行,这将指向有问题的行。

问题似乎出在第 94 行:

ccEr.erMove();

ccEr 为空。

你定义这个变量两次,一次在第 37 行:

Errant ccEr;

第 63 行:

Errant ccEr = new Errant (xoEr, yoEr, cRotO);

处理似乎只考虑第一个(第 37 行),而在那个你实际上并没有创建对象,只是一个名为 ccEr 的变量,里面没有任何内容(如果你愿意,可以为 null)

现在,我注释了第 37 行,然后它根本找不到变量!这让我感到困惑,因为我知道您可以在任何地方定义 "global" 变量。显然,Processing 的内部 hocus-pocus 已更改,因此您必须在 setup()...

上方传输第 63 行(您定义和创建 ccEr 的地方)