【问题标题】:Origin of ArrayIndexOutOfBoundsException in android?android中ArrayIndexOutOfBoundsException的起源?
【发布时间】:2015-04-18 00:35:47
【问题描述】:

我制作了一个 5x5 的 2D 方形按钮阵列,它在一个称为有机体的类中定义,并将它们从右到左、从上到下排列成一个游戏板。当一个有机体被点击时,它会改变颜色(再次点击它会恢复它的原始颜色)。当您单击阵列侧面的(不同的,非生物体)按钮时,阵列中已单击的那些生物体右侧的所有按钮本身应该会改变颜色。在代码中,这个onClick方法被称为IterateListener()

这就是问题所在。我尝试做最后一部分,点击侧面的按钮,应用程序停止,我得到一个 ArrayIndexOutOfBounds。

E/AndroidRuntime(893): Caused by: java.lang.ArrayIndexOutOfBoundsException: length=5; index=5

我确保它指的是数组中间的有机体,所以右边的有机体应该在范围内。还有什么会抛出arrayIndexOutOfBounds?如果您还想查看代码的任何其他部分,请告诉我,但现在我展示的是 Logcat 特别抱怨的代码部分。

这是 getRightOrganism 的代码:

public Organism findRightOrg(Organism org) {
    return Col[org.getRow() + 1][org.getCol()];

}

这是 onClick 的代码:

public void IterateListener(View v) {
    for (int i = 0; i < colony.getWidth(); i++)
        for (int j = 0; j < colony.getHeight(); j++) {
            if (colony.getOrg(i, j).isAlive()) {
                colony.findRightOrg(colony.getOrg(i, j)).liveO();
                }
        }
}

非常感谢!

【问题讨论】:

    标签: android onclick logcat indexoutofboundsexception


    【解决方案1】:

    好吧,在数组中,您只能从 0 迭代到 length-1。因此,在您的i = colony.getWidth() - 1 中,您尝试查找带有row = lenght-1+1 = length 的元素,该元素超出了该数组的范围。

    【讨论】:

    • 它不应该试图找到 row = length - 1 + 1 因为 findRightOrganism() 应该只为最中心的有机体调用,其中右边的有机体在边界内。
    • @DanP 好的。你如何确保它不是边缘生物,这个检查是否发生在isAlive()?在这种情况下,mb isAlive() 逻辑中存在错误?
    • 好吧,我通过选择一个非边缘的有机体来确保它不是边缘有机体——这就是我所说的阵列中间的有机体的意思。在一组 5x5 生物体中,我单击第三列和第三行中的一个。所以正确的是在范围内。这是isAlive()方法:
      public boolean isAlive() { if(btn.getText().equals("X")) return true; else return false; }
      这是点击生物的代码:
    • 对格式也很抱歉...我试图弄清楚如何添加换行符,然后它就超时了。
    • @DanP 只是尝试从您的应用程序的术语中抽象出来。我在您的第二个 sn-p 中看到的是您遍历一个二维数组,并且在其范围内进行。但是当i=4j=0 时,你会关注colony.getOrg(4, 0).isAlive()。如果这个组织确实存在,我们继续:colony.findRightOrg(colony.getOrg(4, 0)),它返回 Col[4 + 1][0];,它不存在。当然,如果您的 Organism.getRow() 返回 0 索引位置,如 Col[][] 数组,而不是 1 索引,在这种情况下它会提前一步失败。
    猜你喜欢
    • 1970-01-01
    • 2014-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-03
    • 1970-01-01
    • 1970-01-01
    • 2013-05-28
    相关资源
    最近更新 更多