为什么这会给出一个超出范围的例外?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么这会给出一个超出范围的例外?相关的知识,希望对你有一定的参考价值。

我一直在尝试解决这一部分的问题一段时间,似乎无法理解为什么这会不断抛出异常。故障排除似乎说我不应该是我不应该出界,但产生的结果似乎不一致。例如,这是测试的结果。我真的不明白this会发生什么。这个方法在ArrayList中设置对象的邻居有什么明显的错误吗?我只是想知道这里是否有任何明显的逻辑错误,如果不是,我只需要自己测试更多。感谢您的帮助。

    public void setNeighbors(ArrayList<ArrayList<Objects>> arrayList) //sets the neighboring tiles for each tile
{
    //arrayList is an multi dimensional array of Objects with a variable size. It is created in another method
    for(int i = 0; i < arrayList.size(); i++)
    {
        for(int x = 0; x < arrayList.get(i).size(); x++)
        {
            // 1 2 3 
            // 4 @ 6
            // 7 8 9
            if((i>0&&x>0) && x<arrayList.get(i).size()-1 && i<arrayList.size()-1)
            {   //goes 1 3 7 9
                System.out.println("Max X:"+(arrayList.get(i).size()-1));
                System.out.println("Max Y:"+(arrayList.size()-1));
                System.out.println("X:"+x);
                System.out.println("Y:"+i);
                // A Floor is a type of Object and addNeighbor adds a Floor object to an ArrayList of Floor Objects within a Floor
                ((Floor)arrayList.get(i).get(x)).addNeighbor((Floor)arrayList.get(i-1).get(x-1));
                ((Floor)arrayList.get(i).get(x)).addNeighbor((Floor)arrayList.get(i-1).get(x+1));
                ((Floor)arrayList.get(i).get(x)).addNeighbor((Floor)arrayList.get(i+1).get(x-1));
                ((Floor)arrayList.get(i).get(x)).addNeighbor((Floor)arrayList.get(i+1).get(x+1));
            }
            if (x>0 && x<arrayList.get(i).size()-1) 
            { // 4 6
                ((Floor)arrayList.get(i).get(x)).addNeighbor((Floor)arrayList.get(i).get(x-1));
                ((Floor)arrayList.get(i).get(x)).addNeighbor((Floor)arrayList.get(i).get(x+1));
            }
            if (i>0 && i<arrayList.size()-1) 
            { // 2 8
                ((Floor)arrayList.get(i).get(x)).addNeighbor((Floor)arrayList.get(i-1).get(x));
                ((Floor)arrayList.get(i).get(x)).addNeighbor((Floor)arrayList.get(i+1).get(x));
            }

        }
    }
}
答案

由于代码似乎在吹嘘x + 1的值,要么是行((Floor)arrayList.get(i).get(x)).addNeighbor((Floor)arrayList.get(i-1).get(x+1));

或者线

((Floor)arrayList.get(i).get(x)).addNeighbor((Floor)arrayList.get(i+1).get(x+1));

有错。在任何一种情况下,它都表明单个ArrayLists的长度不是恒定的。

另一答案

在你的if-statement你有:

if((i>0&&x>0) && x<arrayList.get(i).size()-1 && i<arrayList.size()-1)

因此,请检查以确保x位于ith位置的arrayList的边界内。但是你改变了i。因此,虽然x可以在arrayList(i)的范围内,但它可能不会受到arrayList(i + 1)的限制

另一答案

ix已经达到其最大有效值时,您的代码仍然可以尝试向它们添加1并使用结果进行索引。

另一答案

原因是关于x + 1和i + 1的以下行

 ((Floor)arrayList.get(i).get(x)).addNeighbor((Floor)arrayList.get(i+1).get(x+1));

你的if子句必须检查x上的size() - 2和i变量不是-1。

不知道你在做什么,这应该工作。认为算法不能以正确的方式工作,你必须检查

for(int x = 0; x < arrayList.get(i).size(); x++)
    {
        // 1 2 3 
        // 4 @ 6
        // 7 8 9
        if((i>0&&x>0) && x<arrayList.get(i).size()-2 && i<arrayList.size()-2)
        {   //goes 1 3 7 9
            System.out.println("Max X:"+(arrayList.get(i).size()-1));
            System.out.println("Max Y:"+(arrayList.size()-1));
            System.out.println("X:"+x);
            System.out.println("Y:"+i);
            // A Floor is a type of Object and addNeighbor adds a Floor object to an ArrayList of Floor Objects within a Floor
            ((Floor)arrayList.get(i).get(x)).addNeighbor((Floor)arrayList.get(i-1).get(x-1));
            ((Floor)arrayList.get(i).get(x)).addNeighbor((Floor)arrayList.get(i-1).get(x+1));
            ((Floor)arrayList.get(i).get(x)).addNeighbor((Floor)arrayList.get(i+1).get(x-1));
            ((Floor)arrayList.get(i).get(x)).addNeighbor((Floor)arrayList.get(i+1).get(x+1));
        }
        if (x>0 && x<arrayList.get(i).size()-2) 
        { // 4 6
            ((Floor)arrayList.get(i).get(x)).addNeighbor((Floor)arrayList.get(i).get(x-1));
            ((Floor)arrayList.get(i).get(x)).addNeighbor((Floor)arrayList.get(i).get(x+1));
        }
        if (i>0 && i<arrayList.size()-2) 
        { // 2 8
            ((Floor)arrayList.get(i).get(x)).addNeighbor((Floor)arrayList.get(i-1).get(x));
            ((Floor)arrayList.get(i).get(x)).addNeighbor((Floor)arrayList.get(i+1).get(x));
        }

    }
}

以上是关于为什么这会给出一个超出范围的例外?的主要内容,如果未能解决你的问题,请参考以下文章

活动结果片段索引超出范围:0x20001

Parallel.Foreach 给出错误“索引超出了数组的范围”

Mysql异常“超出范围”?

分段错误:为什么这里的数组索引超出范围?

UICollectionView 给出“索引超出范围”错误

修改 NSFetchRequest 为空数组生成 NSRangeException 索引 0 超出范围