0

Так что в основном я пытаюсь создать немного сложного (для моего уровня программирования) и пытаясь использовать kinect для запуска разных ничьих. Я так жаль этого большого кода, но ошибка медленно сводит меня с умаjava.lang.RuntimeException: java.lang.NullPointerException PROCESSING

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; 
    } 
    } 
} 

И это ошибка, что я получаю

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(Thread.java:745) 
Caused by: java.lang.NullPointerException 
    at hotbox7.draw(hotbox7.java:73) 
    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$10.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$11.run(GLCanvas.java:1300) 
    at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:302) 
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:733) 
    at java.awt.EventQueue.access$200(EventQueue.java:103) 
    at java.awt.EventQueue$3.run(EventQueue.java:694) 
    at java.awt.EventQueue$3.run(EventQueue.java:692) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76) 
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:703) 
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242) 
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161) 
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150) 
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146) 
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138) 
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:91) 
+3

Вы пытались использовать отладчик? – Biffen

+0

@ Биффен У меня еще нет, как использовать отладчик в обработке? Спасибо за быстрый ответ! –

+0

@ У вас есть объект под названием hotbox7? – robin

ответ

0

Я думаю, я нашел ошибку:

Сначала вы объявляете kinect как атрибут класса, тогда вы объявляете новый объект nemed kinect внутри метода setup(). Локальная переменная скрывает атрибут класса, поэтому kinect.enableDepth(); ссылается на локальную переменную, а не на атрибут класса.

Таким образом, атрибут класса никогда не назначается (насколько я могу видеть), поэтому он остается null. Когда вы вызываете метод draw(), он не работает на kinect.update();, потому что он относится к атрибуту класса, который равен null. Поскольку вы пытаетесь вызвать метод a null -объект, Java выбрасывает NullPointerException.

+0

. Это имеет большое значение благодаря вам! Какой был бы лучший способ решить эту проблему? –

+0

@Kerim Очевидно, что не создается в локальной переменной в 'setup()', но с использованием атрибута class ... – Soana

0

у вас уже есть переменная SimpleOpenNI kinect объявлена ​​(только не инициализирован ни к чему), так что не повторно определить его в настройках(), просто присвоить его значение:

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

С помощью SimpleOpenNI kinect = new SimpleOpenNI(this); вы объявляете переменную new, областью действия которой является «только внутри функции setup()», поэтому, когда мы выходим из setup(), эта переменная выбрасывается, а глобальный kinect по-прежнему является нулевым указателем.