Java数组索引越界错误
我正在研究一种蛮力方法来解决旅行推销员的问题。我有一行代码生成了Java数组索引越界错误,java,arrays,Java,Arrays,我正在研究一种蛮力方法来解决旅行推销员的问题。我有一行代码生成了ArrayIndexOutOfBounds异常,但是那里使用的所有数组都有足够的空间。特定代码行: testCity[0][a] = cities[0][(int) cityList[a]]; 这就是我初始化testCity的地方: int[][] testCity = new int[2][CITIES+10]; 城市: public static int[][] cities = new int[2][CITIES+10];
ArrayIndexOutOfBounds
异常,但是那里使用的所有数组都有足够的空间。特定代码行:
testCity[0][a] = cities[0][(int) cityList[a]];
这就是我初始化testCity的地方:
int[][] testCity = new int[2][CITIES+10];
城市
:
public static int[][] cities = new int[2][CITIES+10];
最后,cityList
:
Object[] cityList = new Integer[CITIES+10];
这是完整的错误消息:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 4
at BruteF.permute(BruteF.java:39)
at BruteF.permute(BruteF.java:30)
at BruteF.permute(BruteF.java:30)
at BruteF.permute(BruteF.java:30)
at BruteF.main(BruteF.java:11)
代码如下:
public class BruteF {
public static final int CITIES = 5;
public static int[][] cities = new int[2][CITIES+10];
public static int[][] bestCity = new int[2][CITIES+10];
public static double bestDistance = 1000;
public static int[][] testCity = new int[2][CITIES+10];
public static Object[] cityList = new Integer[CITIES+10];
public static void main(String[] args)
{
permute(java.util.Arrays.asList(1,2,3,4), 0);
for (int i = 0;i < CITIES;i++)
{
System.out.println(bestCity[0][i] + "," + bestCity[1][i]);
}
}
static void permute(java.util.List<Integer> arr, int k){
cities[0][0] = 1;
cities[1][0] = 1;
cities[0][1] = 2;
cities[1][1] = 5;
cities[0][2] = 3;
cities[1][2] = 2;
cities[0][3] = 4;
cities[1][3] = 3;
int originalX = cities[0][0];
int originalY = cities[1][0];
for(int i = k; i < arr.size(); i++){
java.util.Collections.swap(arr, i, k);
permute(arr, k+1);
java.util.Collections.swap(arr, k, i);
}
if (k == arr.size() -1){
for (int i = 0;i < CITIES;i++)
{
cityList = arr.toArray();
for (int a = 0;a < CITIES;a++)
{
testCity[0][a] = cities[0][(int) cityList[a]];
}
if (distance(testCity,CITIES,originalX, originalY) < bestDistance)
{
bestCity = testCity;
bestDistance = distance(testCity,CITIES, originalX, originalY);
}
}
}
}
static double distance (int[][] cities, int CITIES, int originalX, int originalY)
{
int[][] taken = new int[2][CITIES+1];
int takenCounter = 0;
double distance = 0;
cities[0][CITIES] = cities[0][0];
cities[1][CITIES] = cities[1][0];
for (int i = 0;i <= CITIES;i++)
{
for (int z = 0;z <= CITIES;z++)
{
if (cities[0][i] == taken[0][z] && cities[1][i] == taken[1][z])
{
return CITIES*1000; //possible error here
}
else {
taken[0][takenCounter] = cities[0][i];
taken[1][takenCounter] = cities[1][i];
}
}
if (cities[0][0] != originalX && cities[1][0] != originalY)
{
return CITIES*1000; //POSSIBLE BUG HERE
}
distance = distance + Math.sqrt(Math.pow(cities[0][i+1]-cities[0][i],2) + Math.pow(cities[1][i+1]-cities[1][i],2));
}
return distance;
}
}
公共类BruteF{
公共静态最终国际城市=5;
公共静态整数[][]城市=新整数[2][城市+10];
公共静态整数[][]最佳城市=新整数[2][城市+10];
公共静态双最佳距离=1000;
公共静态int[]testCity=newint[2][CITIES+10];
公共静态对象[]城市列表=新整数[城市+10];
公共静态void main(字符串[]args)
{
permute(java.util.Arrays.asList(1,2,3,4),0);
对于(int i=0;i 对于(int i=0;i它给出了越界异常:4
初始化cityList时,即cityList=arr.toArray();数组cityList[]={1,2,3,4},即大小为4,从0到3。
您正在运行for循环,即
for (int a = 0;a < CITIES;a++)
for(int a=0;a
从a=0到CITIES,因此当a=4的时刻到来时,它会给出越界错误。cityList[a]
中的任何内容都大于或等于CITIES+10
。另外,为什么您要将cityList
声明为对象[]
,而不是整数[]
?@resueman声明a
的循环是for(int a=0;a
。此外,我声明cityList
为对象[]
,因为在程序的另一部分,如果我将其更改为整数[]
,它会产生错误无法从对象[]转换为整数[]
Unknown code cause exception with Unknown stack trace.我们如何才能找到bug?@jbnitet我应该包含整个代码吗?您应该发布识别问题所需的最少代码量,以及异常的完整堆栈跟踪。这至少包括从堆栈跟踪引用的代码,即异常被抛出。一般建议:在请求帮助之前,您应该自己调试它。如果您使用eclipse,则可以使用调试器。