web-dev-qa-db-fra.com

Pourquoi ai-je une exception InvocationTargetException? Android jeu 2D

Je fais un jeu 2D en Android avec Cocos2D, écrit en Java. Voici mon code pour l'essentiel:

public void gameLoop(float dt) {
    //Player Gravity
    if(canExecuteMovement(0, 6)) {
        guy.moveY(6);
    }

    //Player Movement
    if(direction == 1) {
        if(canExecuteMovement(-3, 0))
            guy.moveX(-3);
    } else if(direction == 2) {
        if(canExecuteMovement(3, 0))
            guy.moveX(3);
    }
}

private boolean canExecuteMovement(int xChange, int yChange) {
    int projectedX = guy.getBounds().left + xChange;
    int projectedY = guy.getBounds().top + yChange;
    Log.i("DD", "guy:" + guy.getBounds().toString());
    Rect projectedBounds = new Rect(projectedX, projectedY, projectedX + guy.getWidth(), projectedY + guy.getHeight());
    Log.i("DD", "guy:" + projectedBounds.toString());
    for (int i = 0; i < platformCount; i++) {
        if (Rect.intersects(projectedBounds, platform[i].getBounds())) {
            return false;
        }
    }

    return true;
}

Comme vous le voyez, cette fonction semble très bien, et les rectangles dans canExecuteMovement sont également parfaitement bien, cependant dans cette ligne:

LINE 107: if (Rect.intersects(projectedBounds, platform[i].getBounds())) {

Je reçois une exception InvocationTargetException. Voici le logcat:

01-21 23:10:12.601: W/System.err(13118): Java.lang.reflect.InvocationTargetException
01-21 23:10:12.601: W/System.err(13118):    at Java.lang.reflect.Method.invokeNative(Native Method)
01-21 23:10:12.605: W/System.err(13118):    at Java.lang.reflect.Method.invoke(Method.Java:511)
01-21 23:10:12.605: W/System.err(13118):    at org.cocos2d.actions.CCTimer.update(CCTimer.Java:82)
01-21 23:10:12.605: W/System.err(13118):    at org.cocos2d.actions.CCScheduler.tick(CCScheduler.Java:253)
01-21 23:10:12.605: W/System.err(13118):    at org.cocos2d.nodes.CCDirector.drawCCScene(CCDirector.Java:679)
01-21 23:10:12.605: W/System.err(13118):    at org.cocos2d.nodes.CCDirector.onDrawFrame(CCDirector.Java:649)
01-21 23:10:12.605: W/System.err(13118):    at Android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.Java:1462)
01-21 23:10:12.605: W/System.err(13118):    at Android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.Java:1216)
01-21 23:10:12.605: W/System.err(13118): Caused by: Java.lang.NullPointerException
01-21 23:10:12.608: W/System.err(13118):    at com.qasim.platformer.GameLayer.canExecuteMovement(GameLayer.Java:107)
01-21 23:10:12.608: W/System.err(13118):    at com.qasim.platformer.GameLayer.gameLoop(GameLayer.Java:86)
01-21 23:10:12.608: W/System.err(13118):    ... 8 more
01-21 23:10:12.620: D/dalvikvm(13118): GC_CONCURRENT freed 460K, 6% free 9279K/9863K, paused 2ms+3ms
01-21 23:10:12.624: I/DD(13118): guy:Rect(252, 63 - 300, 111)

Quel pourrait être le problème? la classe getBounds () dans guy est la suivante:

public Rect getBounds() {
    return new Rect(x, y, x+width, y+height);
}
17
Qasim

InvocationTargetException est juste un wrapper pour une exception qui est levée dans une invocation dynamique. Le vrai problème est le NullPointerException qu'il enveloppe:

Caused by: Java.lang.NullPointerException
  at com.qasim.platformer.GameLayer.canExecuteMovement(GameLayer.Java:107)
  at com.qasim.platformer.GameLayer.gameLoop(GameLayer.Java:86)

Comme vous l'avez souligné, voici la ligne incriminée:

if (Rect.intersects(projectedBounds, platform[i].getBounds())) {

Le seul endroit où un pointeur nul pourrait se produire sur cette ligne est à platform[i].getBounds(). Soit platform lui-même est null, soit l'élément à platform[i] L'est.

45
Paul Bellora