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