one - dev java
¿Por qué recibo una InvocationTargetException? Juego de Android 2D (1)
Estoy haciendo un juego 2D en Android con Cocos2D, escrito en Java. Aquí está mi código para las cosas principales:
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;
}
Como puede ver, esta función se ve bien y los rectángulos en canExecuteMovement también están perfectamente bien, sin embargo en esta línea:
LINE 107: if (Rect.intersects(projectedBounds, platform[i].getBounds())) {
Estoy recibiendo una InvocationTargetException. Aquí está el 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)
¿Cual podría ser el problema? La clase getBounds () en guy es esta:
public Rect getBounds() {
return new Rect(x, y, x+width, y+height);
}
InvocationTargetException
es solo un contenedor para una excepción que se lanza dentro de una invocación dinámica. El verdadero problema es la NullPointerException
que está envolviendo:
Caused by: java.lang.NullPointerException
at com.qasim.platformer.GameLayer.canExecuteMovement(GameLayer.java:107)
at com.qasim.platformer.GameLayer.gameLoop(GameLayer.java:86)
Como has señalado, esta es la línea ofensiva:
if (Rect.intersects(projectedBounds, platform[i].getBounds())) {
El único lugar donde podría estar sucediendo un puntero nulo en esta línea es en la platform[i].getBounds()
. Cualquiera de las dos platform
es null
, o el elemento en la platform[i]
es.