java.lang.RuntimeException:java.lang.NullPointerException处理

java.lang.RuntimeException:java.lang.NullPointerException处理,java,nullpointerexception,awt,processing,event-dispatch-thread,Java,Nullpointerexception,Awt,Processing,Event Dispatch Thread,因此,基本上,我正在尝试创建一个有点复杂的(对于我的编程水平)并尝试使用kinect触发不同的绘图。 我为这么多的代码感到非常抱歉,但是这个错误正在慢慢地让我发疯 Car worldmap; Hotpoint ColorTrigger; import processing.opengl.*; import SimpleOpenNI.*; SimpleOpenNI kinect; float rotation = 0; int boxSize = 150; PVector blueboxCen

因此,基本上,我正在尝试创建一个有点复杂的(对于我的编程水平)并尝试使用kinect触发不同的绘图。 我为这么多的代码感到非常抱歉,但是这个错误正在慢慢地让我发疯

Car worldmap;
Hotpoint ColorTrigger;

import processing.opengl.*;
import SimpleOpenNI.*;
SimpleOpenNI kinect;

float rotation = 0;
int boxSize = 150;
PVector blueboxCenter = new PVector(200, 800, 600);

PVector boxCenter = new PVector(0, 0, 600);

float s = 1;
void setup() {
  size(displayWidth, displayHeight, OPENGL);

  SimpleOpenNI kinect = new SimpleOpenNI(this);
  kinect.enableDepth();
  ColorTrigger = new Hotpoint(200, 0, 600, 150);
}
void draw() {
  if (keyPressed == true) {
    background(0);
    kinect.update();
    translate(width/2, height/2, -1000);
    rotateX(radians(180));
    translate(0, 0, 1400);
    rotateY(radians(map(mouseX, 0, width, -180, 180)));
    translate(0, 0, s*-1000); 
    scale(s);
    stroke(255);
    PVector[] depthPoints = kinect.depthMapRealWorld();
    int depthPointsInBox = 0;
    for (int i = 0; i < depthPoints.length; i+=10) {
      PVector currentPoint = depthPoints[i];
      point(currentPoint.x, currentPoint.y, currentPoint.z);
      ColorTrigger.check(currentPoint);
    }

    ColorTrigger.display();      

    ColorTrigger.clear() ;
    ColorTrigger.wasJustHit = ColorTrigger.currentlyHit(); 
    ColorTrigger.pointsIncluded = 0;
  } else {
    worldmap.display();
  }
}

    class Hotpoint {
  PVector center;
  color fillColor;
  color strokeColor;
  int size;
  int pointsIncluded;
  int maxPoints;
  boolean wasJustHit;
  int threshold;
  float Gotme;
  Hotpoint(float centerX, float centerY, float centerZ, int boxSize) 
  { 
    center = new PVector(centerX, centerY, centerZ);
    size = boxSize;
    pointsIncluded = 0;
    maxPoints = 1000;
    threshold = 0;
    fillColor = strokeColor = color(random(255), random(255), random(255));
  }
  void setThreshold( int newThreshold ) {
    threshold = newThreshold;
  }
  void setMaxPoints(int newMaxPoints) {
    maxPoints = newMaxPoints;
  }
  void setColor(float red, float blue, float green) {
    fillColor = strokeColor = color(red, blue, green);
  }
  boolean check(PVector point) {
    boolean result = false;
    if (point.x > center.x - size/2 && point.x < center.x + size/2) {
      if (point.y > center.y - size/2 && point.y < center.y + size/2) {
        if (point.z > center.z - size/2 && point.z < center.z + size/2) {
          result = true;
          pointsIncluded++;
        }
      }
    }
    return result;
  }
  void display() {  



    float Gotme = map(pointsIncluded, 0, 1000, 0, 255); 

    translate(center.x, center.y, center.z);
    rotateY(-PI/6);    
    rotateY(radians(frameCount));        
    println(Gotme);

    fill(255, 0, 0, Gotme);
    stroke(255, 0, 0);
    box(boxSize);
  }

  boolean currentlyHit() { 
    return (pointsIncluded > threshold);
  }
  boolean isHit() { 
    return currentlyHit() && !wasJustHit;
  }
  void clear() {
    wasJustHit = currentlyHit(); 
    pointsIncluded = 0;
  }
}
class Car { 
  color c;
  float xpos;
  float ypos;
  float xspeed;

  // The Constructor is defined with arguments.
  Car(color tempC, float tempXpos, float tempYpos, float tempXspeed) { 
    c = tempC;
    xpos = tempXpos;
    ypos = tempYpos;
    xspeed = tempXspeed;
  }

  void display() {
    stroke(0);
    fill(c);
    rectMode(CENTER);
    rect(xpos, ypos, 20, 10);
  }

  void drive() {
    xpos = xpos + xspeed;
    if (xpos > width) {
      xpos = 0;
    }
  }
}

我想,我发现了错误:

首先将
kinect
声明为类属性,然后在
setup()
-方法中声明一个新对象nemed
kinect
。局部变量隐藏了class属性,因此
kinect.enableDepth()引用局部变量,而不是类属性


因此,class属性从未被赋值(就我所见),因此它保持为
null
。调用
draw()
-方法时,它将在
kinect.update()上失败null
。因为您试图将方法调用为
null
-对象,Java抛出
NullPointerException

您已经声明了
SimplePenni kinect
变量(只是没有初始化为任何值),所以不要在setup()中重新定义它,只需将其赋值:

void setup() {
  ... 
  kinect = new SimpleOpenNI(this);
  ...
}

通过使用
simplepenni kinect=new simplepenni(此)
您正在声明一个新变量,其作用域为“仅在setup()函数中处于活动状态”,因此当我们退出setup()时,该变量将被丢弃,全局
kinect
仍然是空指针。

您尝试过使用调试器吗?@Biffen我还没有,如何在处理过程中使用调试器?感谢您的快速回复@您是否有一个名为hotbox7的对象?@robin hotbox7实际上是草图的名称。原因:java.lang.NullPointerException at hotbox7.draw()我们可以理解的是,您调用了空对象(hotbox7)上的draw方法。这就是为什么你会出错。你能展示一下你是如何使用草图的吗?这很有道理,谢谢!解决此类问题的最佳方法是什么?@Kerim显然不是在
setup()
中创建局部变量,而是使用class属性。。。
void setup() {
  ... 
  kinect = new SimpleOpenNI(this);
  ...
}