处理 - for循环中增加的空指针异常

时间:2014-12-09 22:30:23

标签: nullpointerexception int processing

我在Processing中编写视频跟踪程序。 有人知道为什么我在将int numberofblobs增加1时收到一个空指针异常。初始值是两个。

这是提供一些上下文的整个代码。我已经清理了大多数无关紧要的东西。

int numberofblobs;

void setup()
{
  numberofblobs = 2;

  // Size of applet
  size(640, 480);

  // BlobDetection
  // img which will be sent to detection (a smaller copy of the cam frame);
  img = new PImage(80, 60); 
  theBlobDetection = new BlobDetection(img.width, img.height);
  theBlobDetection.setPosDiscrimination(false);
  theBlobDetection.setThreshold(0.9f); // will detect bright areas whose luminosity > 0.2f;
}

// ==================================================
// captureEvent()
// ==================================================
void captureEvent(Capture cam)
{
  cam.read();
  newFrame = true;
}

// ==================================================
// draw()
// ==================================================
void draw()
{
  if (!starttracking) {
    for (int i = 0; i<10; i++) {
      if (UNLOCKED[i])
        starttracking = true;
    }
  }
  if (newFrame)
  {
    newFrame=false;
    image(cam, 0, 0, width, height);
    img.copy(cam, 0, 0, cam.width, cam.height, 
    0, 0, img.width, img.height);
    theBlobDetection.computeBlobs(img.pixels);



    //if (starttracking) {

    locateBlobs();
    //}
  }

  println("numberofblobs:");
  println(numberofblobs);
}

// ==================================================
// locateBlobs()
// ==================================================
void locateBlobs()
{
  noFill();
  Blob b;
  for (int n=0; n<theBlobDetection.getBlobNb (); n++)
  {
    b=theBlobDetection.getBlob(n);

   if (n<numberofblobs) {
      println(n);
      vectors[n].x = b.xMin*width;
      vectors[n].y = b.yMin*height;
      println(n);
      // Blobs

      strokeWeight(1);
      stroke(255, 0, 0);
      ellipse(
      vectors[n].x, vectors[n].y, 80, 80 //b.xMin*width-(b.w*width),b.yMin*height-(b.h*height),30,30
      );
    }
  }
}


void keyPressed() {
  if (key =='1') {
    if (!UNLOCKED[0]) {
      numberofblobs++;
    }
    UNLOCKED[0]=true;
  } else if (key =='2') {
    if (!UNLOCKED[1]) {
      numberofblobs++;
    }

}
}

抛出错误(在LocateBlobs()中):

时,处理突出显示此行
vectors[n].x = b.xMin*width;

在尝试进一步缩小范围时,我立即得到空指针异常,而不增加numberofblobs int。 突出显示的行仍然相同。

这是进一步简化的代码:

int numberofblobs;
PVector[] vectors = new PVector[10];

void setup()
{
  numberofblobs = 2; // max 10

  // Size of applet
  size(640, 480);
}

void draw()
{
  println("numberofblobs:"); println(numberofblobs);
  locateBlobs();
}

void locateBlobs()
{
  noFill();
  for (int n=0; n<10; n++)
  {
   // b=theBlobDetection.getBlob(n);
    int i = n;
   if (n<numberofblobs) {
      println(n);
      vectors[n].x = 10;
      vectors[n].y = 10;

      strokeWeight(1);
      stroke(255, 0, 0);
      //ellipse(
      //vectors[n].x, vectors[n].y, 80, 80);
    }
  }
}

void keyPressed() {
  if (key =='1') {
      numberofblobs++;
  }
}

2 个答案:

答案 0 :(得分:0)

在显示的代码中,您没有创建PVector。除非它们是在其他地方创建的,否则这可能是让你获得NPE的原因。

PVector是一个对象,您需要在访问其字段之前创建它们。

在:

PVector[] vectors = new PVector[10];

您创建了包含10个null“对象”的PVector类型的数组。但根本没有PVector。

你应该做

for(int i = 0; i< vectors.length; i++){
    vectors[i] = new PVector();
   }

尚未设置。

然后你可以稍后做:

vectors[n].x = 10;

或者你可以在locateBlobs func中创建它们,例如:

   if (n<numberofblobs) {
      vectors[n] = new PVector(10,10);
    // blah :)

   }

注意:所有代码未经测试

HTH

答案 1 :(得分:0)

感谢上一个回答,我发现了问题。

在for循环中,创建我的Pvectors我使用numberofblobs作为约束。这样,如果numberofblobs增加,则可用的矢量太少。

所以最初:

for(int i = 0; i< numberofblobs; i++){
    vectors[i] = new PVector();
   }

应该是

for(int i = 0; i< maxnumberofblobs; i++){
    vectors[i] = new PVector();
   }