Why am I getting an InvocationTargetException? Android 2D game

80,020

InvocationTargetException is just a wrapper for an exception that's thrown within a dynamic invocation. The true problem is the NullPointerException that it's wrapping:

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

As you've pointed out, this is the offending line:

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

The only place a null pointer could be happening on this line is at platform[i].getBounds(). Either platform itself is null, or the element at platform[i] is.

Share:
80,020
Qasim
Author by

Qasim

Software developer working on Outlook for iOS. Student at University of Toronto. 20 years old.

Updated on July 05, 2022

Comments

  • Qasim
    Qasim almost 2 years

    I am making a 2D game in Android with Cocos2D, written in Java. Here is my code for the main stuff:

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

    As you see, this function looks just fine, and the rectangles in canExecuteMovement are perfectly fine too, however in this line:

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

    I am getting a InvocationTargetException. Here is the 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)
    

    What could be the problem? the getBounds() class in guy is this:

    public Rect getBounds() {
        return new Rect(x, y, x+width, y+height);
    }
    
  • djthoms
    djthoms over 8 years
    For any of those who are passing by you can see the cause of this by e.getCause()