2012-01-22 39 views
17

Tôi đang tạo một trò chơi 2D trong Android với Cocos2D, được viết bằng Java. Đây là mã của tôi cho những thứ chính:Tại sao tôi nhận được InvocationTargetException? Android 2D trò chơi

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

Như bạn thấy, chức năng này trông giống tốt, và hình chữ nhật trong canExecuteMovement là hoàn toàn tốt đẹp quá, tuy nhiên trong dòng này:

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

Tôi nhận được một InvocationTargetException. Đây là 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) 

Điều gì có thể là vấn đề? các getBounds() lớp trong chàng là thế này:

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

Dòng 107 trong chương trình GameLayer.java của bạn là gì? – kosa

Trả lời

45

InvocationTargetException chỉ là một wrapper cho một ngoại lệ đó là ném trong một cuộc gọi động. Vấn đề thực sự là NullPointerException rằng đó là gói:

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

Như bạn đã chỉ ra, đây là dòng vi phạm:

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

Nơi duy nhất một con trỏ null có thể xảy ra trên đường dây này là tại platform[i].getBounds(). Hoặc là platform chính nó là null hoặc phần tử tại platform[i] là.

+3

Đối với bất kỳ ai trong số những người đang đi qua bạn có thể thấy _cause_ của điều này bằng 'e.getCause()' – djthoms

Các vấn đề liên quan