【问题标题】:how do i stop this "IndexOutOfBoundsException" issue?我如何停止这个“IndexOutOfBoundsException”问题?
【发布时间】:2013-10-02 00:38:26
【问题描述】:

所以我的应用程序允许用户在网格上放置块,如果用户排列 3 个或更多块具有相同的西装或颜色,那么就会发生一些事情。当玩家放置一个方块时,我调用这个方法:

   blocks_.add(new Block(new Vector2(rect_mouse.x, rect_mouse.y), blocks_.get(0).blockID, blockCount)); 

当你将 3 个或更多放在一起时,我称之为这些方法:

    blocks_.removeValue(blocks_.get(left_bravo_indexNum), true);
    blocks_.removeValue(blocks_.get(center_charlie_indexNum), true);
    blocks_.removeValue(blocks_.get(right_alpha_indexNum), true);


    stack:
    Exception in thread "LWJGL Application" java.lang.IndexOutOfBoundsException: 13
at com.badlogic.gdx.utils.Array.get(Array.java:125)
at com.jrp.mygearapp.GameScreen.touchUp(GameScreen.java:1443)
at com.badlogic.gdx.backends.lwjgl.LwjglInput.processEvents(LwjglInput.java:297)
at com.badlogic.gdx.backends.lwjgl.LwjglApplication.mainLoop(LwjglApplication.java:186)
at com.badlogic.gdx.backends.lwjgl.LwjglApplication$1.run(LwjglApplication.java:110)

这是为了删除块,但它导致了这个 IndexOutOfBoundsException。有没有办法防止这个错误?

这可能会发生,因为数组会自动对元素数量进行排序并将数量降低到数组中正确的元素数量,并且我仍然有标记为高于数组大小的元素。我还是个新手,所以我的分析可能不正确。如果是这种情况,请提醒我并帮助我找到解决方法。 谢谢。

已编辑* TouchUp() 函数-------

   @Override
     public boolean touchUp(int x, int y, int pointer, int button) {

    if (button == 0)  {

        display_blockCheck = false;

        ////set blockCount to the size of blockArray so blocks can properly be indexed              
        blockCount = blocks_.size;

        if (!overlap) {

            Gdx.app.log("Block Added", "x: " + x + " y: " + y);

            updateQueueBlocks();


            //add block
            Vector2 rect_vector = new Vector2(rect_mouse.x, rect_mouse.y);
            Block block = new Block(rect_vector,blocks_.get(0).blockID, blocks_.size);

            blocks_.add(block);             

     if (center_charlie_suit == "Square") {

                center_charlie_bool = true;

                if (right_bravo_suit == "Square") {

                    right_bravo_bool = true;

                    if (right_alpha_suit == "Square") {

                        Gdx.app.log("3-pair", "Square:345:lr");

                        right_alpha_bool = true;

                        //call 3-pair event
                        blocks_.removeValue(blocks_.get(center_charlie_indexNum), true);
                        blocks_.removeValue(blocks_.get(right_alpha_indexNum), true);
                        blocks_.removeValue(blocks_.get(right_bravo_indexNum), true);
                        }
                }
            }

剩下的真的很长,只是检查彼此相邻的其他块..

【问题讨论】:

  • 首先尝试添加堆栈跟踪,第二个最有可能的错误将是在那长行中,如何拆分一些东西但是这样你可以获得更好的堆栈跟踪?创建一个实例并将其作为参数传递。此错误意味着您正在为数组/列表/等调用无效索引。我打赌在这里:new Vector2(rect_mouse.x, rect_mouse.y) 但我不知道 Vector2 是什么。
  • 您可以将堆栈跟踪添加到问题中。
  • 请原谅我的无知,你把事情分开是什么意思? Vector2是方块的绳索,新的Block是Block类的一个实例,blockID是什么类型的block,block count是数组内的block的索引号
  • 先创建Vector2 vector... Block block = new Block(vector).. blocks_.add(block)...,而不是添加blocks_.add( new BLock(new Vector....(,这样你就可以保证一个一个,你所有的实例都可以创建。
  • 好吧,如果您的 blocks_ 是 com.badlogic.gdx.utils.Array 的实例,那么 Ray 的答案似乎是正确的。您可能会遇到问题,因为您在删除元素时使用了索引。

标签: java libgdx


【解决方案1】:

你是对的,当你删除块时,索引会改变。

您没有显示 Collection blocks_ 是什么类型的集合(Vector2?,你写了吗?),但是,与其跟踪元素的索引,只需跟踪元素本身并调用 remove() 来查找并删除该元素。

【讨论】:

  • public Array blocks_ = new Array();它与上面的代码在同一个类中..
  • 您正在调用 blocks_.get(0),您可以更新代码以添加 blocks_.add.. 调用的位置吗?还是这个类默认有任何元素?
  • 你是说“我可以更新代码以返回被删除块的 indexPosition 吗?” Block 类有几个元素 public Block(Vector2 pos, int id, int index, int color, int suit) {
  • indexleft_bravo_indexNum等从哪里来?如果您改为执行Block left_bravo_block = blocks_.get(wherever you're getting left_bravo_indexNum from); 之类的操作,则可以整天拨打removeValue(left_bravo_block) 没有问题。
  • 好的,left_alpha 是一个矩形,中心矩形左侧 2 个空格,左 bravo 是中心左侧 1 个空格我在中心矩形的每个方向上都有 2 个矩形,在 TouchUp() 事件中,我检查每个 alpha 和 bravo rect 与它可能相交的任何块的交集,所以如果 left_alpha_rect 超过 block_.get(12),我会这样做 left_alpha_indexNum = block_.get(12).indexNum,我认为这将给我索引号/要删除的正确块...
猜你喜欢
  • 1970-01-01
  • 2022-01-15
  • 2019-04-23
相关资源
最近更新 更多