为什么这会给出一个超出范围的例外?
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)
的限制
当i
或x
已经达到其最大有效值时,您的代码仍然可以尝试向它们添加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));
}
}
}
以上是关于为什么这会给出一个超出范围的例外?的主要内容,如果未能解决你的问题,请参考以下文章