首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么我会得到一个InvocationTargetException?Android 2D游戏

为什么我会得到一个InvocationTargetException?Android 2D游戏
EN

Stack Overflow用户
提问于 2012-01-22 12:11:44
回答 1查看 79.6K关注 0票数 18

我正在用Cocos2D在安卓做一个2D游戏,用Java写的。以下是我的主要内容的代码:

代码语言:javascript
复制
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;
}

正如您所看到的,这个函数看起来很好,canExecuteMovement中的矩形也非常好,但是在这一行中:

代码语言:javascript
复制
LINE 107: if (Rect.intersects(projectedBounds, platform[i].getBounds())) {

我要买一台InvocationTargetException。下面是logcat:

代码语言:javascript
复制
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)

可能的问题是什么?guy中的getBounds()类如下所示:

代码语言:javascript
复制
public Rect getBounds() {
    return new Rect(x, y, x+width, y+height);
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-01-22 12:43:04

InvocationTargetException只是动态调用中抛出的异常的包装器。真正的问题是它包装的NullPointerException

代码语言:javascript
复制
Caused by: java.lang.NullPointerException
  at com.qasim.platformer.GameLayer.canExecuteMovement(GameLayer.java:107)
  at com.qasim.platformer.GameLayer.gameLoop(GameLayer.java:86)

正如您所指出的,这是令人不快的一行:

代码语言:javascript
复制
if (Rect.intersects(projectedBounds, platform[i].getBounds())) {

在此行中,空指针可能出现的唯一位置是platform[i].getBounds()。要么是platform本身是null,要么是platform[i]上的元素是。

票数 49
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8958882

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档