Java 为什么会出现越界异常?

Java 为什么会出现越界异常?,java,arraylist,Java,Arraylist,我已经试着解决这个部分的问题有一段时间了,但似乎不明白为什么这个部分总是抛出一个越界异常。故障排除似乎是说我不应该,我不应该出界,但是产生的结果似乎不一致。例如,下面是一个测试的结果。我真的不明白这样的事情是怎么发生的。这种在ArrayList中设置对象邻居的方法有什么明显的错误吗?我只是想知道这里是否有任何明显的逻辑错误,如果没有,我将不得不自己测试更多。谢谢你的帮助 public void setNeighbors(ArrayList<ArrayList<Objects&

我已经试着解决这个部分的问题有一段时间了,但似乎不明白为什么这个部分总是抛出一个越界异常。故障排除似乎是说我不应该,我不应该出界,但是产生的结果似乎不一致。例如,下面是一个测试的结果。我真的不明白这样的事情是怎么发生的。这种在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));
            }

        }
    }
}
public void setneights(ArrayList ArrayList)//为每个磁贴设置相邻磁贴
{
//arrayList是具有可变大小的多维对象数组。它是用另一种方法创建的
对于(int i=0;i如果((i>0&&x>0)和&x当
i
x
已经达到其最大有效值时,您的代码仍然可以尝试向其添加1,并使用结果进行索引。

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

 ((Floor)arrayList.get(i).get(x)).addNeighbor((Floor)arrayList.get(i+1).get(x+1));
if子句必须检查x和i变量而不是-1上的size()-2

在不知道你到底在做什么的情况下,这应该是可行的。如果你认为算法不能以正确的方式工作,你必须检查一下

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

    }
}
for(int x=0;x如果((i>0&&x>0)和&x在您的
if语句中,您有:


如果((i>0&&x>0)和&x由于代码似乎在x+1的值上爆炸,则
((楼层)arrayList.get(i).get(x)).addNeighbor((楼层)arrayList.get(i-1).get(x+1));

还是排队

((楼层)arrayList.get(i).get(x)).addNeighbor((楼层)arrayList.get(i+1).get(x+1));


在这两种情况下,都表明单个arrayList的长度不是恒定的。

((Floor)arrayList.get(i).get(x)).addNeighbor((Floor)arrayList.get(i).get(x+1));此处x+1可以大于引发异常的数组?@juzraai这取决于,似乎任何一行都可以,但是在上一次测试中,它是第一个if语句中的最后一行,错误如图所示。@Denis if语句中包含的检查不应该阻止它越界吗?因为OP没有那么多比大小-1大,向索引中添加一个不会导致其超出边界EAH,但大小为Arraylist的长度,因此具有四个元素的列表的大小为4,但索引i或x从0开始。但是
i
x
只会循环,直到小于大小减1为止(在我们的示例中,大小为4的两个)因此,当您添加一个时,您将得到三个,这是虚构的
ArrayList
中的一个有效索引,但这是错误的。例如,您的列表有3个元素。列表的最后一个元素由get(2)寻址。因此,如果您的if子句变为size()-1(3-1)=2,然后尝试获取(2+1)这会导致索引超出范围,因为您的最后一个元素是get(2)和not get(3)。在示例中,它有四个元素。因此get(3)将是
ArrayList的最后一个索引。这是答案,谢谢。问题已解决。