【问题标题】:java.lang.IndexOutOfBoundsException: Invalid index 13, size is 13java.lang.IndexOutOfBoundsException:索引 13 无效,大小为 13
【发布时间】:2013-08-09 13:43:19
【问题描述】:

我遇到了一些奇怪的错误,导致我的 android 应用程序崩溃。它是一个测验应用程序。因此,当用户正确回答 2/3 问题时,然后单击下一个按钮,它会崩溃。并显示索引 13 错误。但我不知道在哪里修复/寻找。这是我的代码 sn-p。

public Vector<Sprite> defaultTile;

private void GameResults()
{
    if(result.equals("right"))      
    {           
        GameOver();
        Log.e("Gaa", "Right Here ->");
    }
}

private void GameOver() {
{
    for (int i = 0; i < defaultTile.size(); i++) {
        defaultTile.get(i).setVisible(false);               
    }
    for (int i = 0; i < defaultTile.size(); i++) 
    {
        unregisterTouchArea(defaultTile.get(i));                
    }
    questionText.detachSelf();   
}   

@Override
public boolean onAreaTouched(TouchEvent event, ITouchArea area, float posX,
        float posY) {

    if(event.isActionUp())
    {
        if(area instanceof Sprite)
        {
            Sprite sprite = (Sprite)area;
            int userData = (Integer) sprite.getUserData();
            switch(userData) 
            {
            case BTN_NEXT:                              
                if(gameState.equals("alpha") && tickBg.isVisible())
                {                       
                    countdown.cancel();                         
                    GameResults();  
                }           

                break;
            }
        }
    }
}   

日志猫详情是这样的

08-09 13:30:50.246: W/dalvikvm(919): threadid=12: thread exiting with uncaught exception (group=0x409c01f8)
08-09 13:30:50.276: E/AndroidRuntime(919): FATAL EXCEPTION: GLThread
08-09 13:30:50.276: E/AndroidRuntime(919): java.lang.IndexOutOfBoundsException: Invalid index 9, size is 9
08-09 13:30:50.276: E/AndroidRuntime(919):  at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:251)
08-09 13:30:50.276: E/AndroidRuntime(919):  at java.util.ArrayList.get(ArrayList.java:304)
08-09 13:30:50.276: E/AndroidRuntime(919):  at org.anddev.andengine.entity.Entity.onManagedDrawChildren(Entity.java:1008)
08-09 13:30:50.276: E/AndroidRuntime(919):  at org.anddev.andengine.entity.Entity.onDrawChildren(Entity.java:1000)
08-09 13:30:50.276: E/AndroidRuntime(919):  at org.anddev.andengine.entity.Entity.onManagedDraw(Entity.java:993)
08-09 13:30:50.276: E/AndroidRuntime(919):  at org.anddev.andengine.entity.shape.Shape.onManagedDraw(Shape.java:120)
08-09 13:30:50.276: E/AndroidRuntime(919):  at org.anddev.andengine.entity.Entity.onDraw(Entity.java:875)
08-09 13:30:50.276: E/AndroidRuntime(919):  at org.anddev.andengine.entity.Entity.onManagedDrawChildren(Entity.java:1008)
08-09 13:30:50.276: E/AndroidRuntime(919):  at org.anddev.andengine.entity.Entity.onDrawChildren(Entity.java:1000)
08-09 13:30:50.276: E/AndroidRuntime(919):  at org.anddev.andengine.entity.Entity.onManagedDraw(Entity.java:993)
08-09 13:30:50.276: E/AndroidRuntime(919):  at org.anddev.andengine.entity.scene.Scene.onManagedDraw(Scene.java:233)
08-09 13:30:50.276: E/AndroidRuntime(919):  at org.anddev.andengine.entity.Entity.onDraw(Entity.java:875)
08-09 13:30:50.276: E/AndroidRuntime(919):  at org.anddev.andengine.engine.Engine.onDrawScene(Engine.java:517)
08-09 13:30:50.276: E/AndroidRuntime(919):  at org.anddev.andengine.engine.Engine.onDrawFrame(Engine.java:509)
08-09 13:30:50.276: E/AndroidRuntime(919):  at org.anddev.andengine.opengl.view.RenderSurfaceView$Renderer.onDrawFrame(RenderSurfaceView.java:154)
08-09 13:30:50.276: E/AndroidRuntime(919):  at org.anddev.andengine.opengl.view.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:617)
08-09 13:30:50.276: E/AndroidRuntime(919):  at org.anddev.andengine.opengl.view.GLSurfaceView$GLThread.run(GLSurfaceView.java:549)

更新

这是我的完整课程文件http://jquery404.com/file/GameScene.txt

【问题讨论】:

  • 在哪一行发生错误?我觉得你不应该在你发布的代码中遇到异常。
  • 请给出正确的代码
  • 某个地方有一个大小为 9 的数组列表,并且对该列表的 get 调用试图获取索引 9 处的项目。对于大小为 9 的数组列表,最高索引为 8,因为索引从 0 开始。即列表中的 9 项将具有索引 0,1,2,3,4,5,6,7,8。
  • 可能是某个地方的线程问题。 Entity 类不是线程安全的。

标签: java android andengine


【解决方案1】:

在编程中索引通常从 0 开始,因此如果您有 9 个项目,则最高索引将是 8。

实际错误是从您正在使用的库中的某些代码中引发的

org.anddev.andengine.entity.Entity.onManagedDrawChildren(Entity.java:1008)

您很可能在单独的线程中更改列表,同时库也在与列表交互。


来自gcode project

    public void onManagedDrawChildren(final Camera pCamera) {
            final ArrayList<IEntity> children = this.mChildren;
            final int childCount = children.size();
            for(int i = 0; i < childCount; i++) {
                    children.get(i).onDraw(pCamera);
            }
    }

由于这是在单独的线程中运行的,因此您很可能在循环迭代时从子 ArrayList 中删除了一个对象。要解决此问题,您应该像 jmr499485 在他的回答中解释的那样,将您的更改称为孩子 ArrayList

java.lang.IndexOutOfBoundsException: Invalid index 13, size is 13

我能看到代码中唯一会导致这种情况的项目是您在许多地方使用过的语句questionText.detachSelf();。你应该改用;

runOnUpdateThread(new Runnable() {
@Override
public void run() {
    questionText.detachSelf();
}
});

【讨论】:

  • 但我没有用过这样的东西:(这里是完整的课程jquery404.com/file/GameScene.txt
  • 这里是完整的项目链接jquery404.com/file/enfamil/premium@Robadob
  • 该行在库中,它是从 OpenGL 渲染循环中调用的。我会扩展我的答案
  • @jquery404 我已经包含了我认为现在应该解决的问题。
  • @Robadob 很好的解释。这确实是问题所在。你的解决方案奏效了。谢谢一群朋友。
【解决方案2】:

这通常发生在您从屏幕上删除某些内容并且不在 updateThread 上执行此操作时。确保您要删除的任何地方都像这样称呼它

runOnUpdateThread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
   //remove/detach your stuff in here
}
});

看到这个类似的问题 - How can repair this error? "java.lang.IndexOutOfBoundsException"

【讨论】:

    猜你喜欢
    • 2013-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多