我在java中使用arraylists来存储和处理文件中的数据。在中等或小数据集上,它工作得很好,但是异常大的数据集抛出一个ArrayIndexOutOfBoundsException,没有规定哪行代码抛出了异常。这可能是内存耗尽的错误还是问题?代码不会对数据大小进行硬编码,因此无法调用不存在的索引。
编辑: 这是抛出错误的方法:
public static ArrayList<Grain> FindGrains(Point[][] p){
ArrayList<Grain> grains = new ArrayList<Grain>();
ArrayList<Point> growthPoints = new ArrayList<Point>();
ArrayList<Point> previousPoints = new ArrayList<Point>();
boolean finGrainGrow = false;
int x = -1;
int y = -1;
int j, k;
int grainNum =-1;
double stepSize = 0.5;
while(true){
x = -1;
y = -1;
growthPoints.clear();
previousPoints.clear();
for(int f =0; f<p.length;f++){
for(int r =0; r<p[0].length;r++){
if(p[r][f].getGrainNum() == -1){
x = r;
y = f;
grains.add(new Grain());
grainNum++;
p[x][y].setGrainNum(grainNum);
grains.get(grainNum).add(p[x][y]);
growthPoints.add(0,p[x][y]);
break;
}
}
if (x!=-1) break;
}
if (x==-1) break;
finGrainGrow = false;
while(!finGrainGrow){
finGrainGrow = true;
previousPoints.clear();
previousPoints.ensureCapacity(growthPoints.size());
for(int q=0;q<growthPoints.size();q++){
previousPoints.add(q,growthPoints.get(q));
}
growthPoints = new ArrayList<Point>();
for(int h = 0; h<previousPoints.size(); h++){
j = (int)(previousPoints.get(h).getX()/stepSize);
k = (int)(previousPoints.get(h).getY()/stepSize);
try{
if(checkMisorientation(p[j][k],p[j-1][k]) && p[j-1][k].getGrainNum() ==-1){
grains.get(grainNum).add(p[j-1][k]);
growthPoints.add(p[j-1][k]);
p[j-1][k].setGrainNum(grainNum);
finGrainGrow = false;
}
}
catch(ArrayIndexOutOfBoundsException t){
}
try{
if(checkMisorientation(p[j][k],p[j+1][k]) && p[j+1][k].getGrainNum() ==-1){
grains.get(grainNum).add(p[j+1][k]);
growthPoints.add(p[j+1][k]);
p[j+1][k].setGrainNum(grainNum);
finGrainGrow = false;
}
}
catch(ArrayIndexOutOfBoundsException t){
}
try{
if(checkMisorientation(p[j][k],p[j][k-1]) && p[j][k-1].getGrainNum() ==-1){
grains.get(grainNum).add(p[j][k-1]);
growthPoints.add(p[j][k-1]);
p[j][k-1].setGrainNum(grainNum);
finGrainGrow = false;
}
}
catch(ArrayIndexOutOfBoundsException t){
}
try{
if(checkMisorientation(p[j][k],p[j][k+1]) && p[j][k+1].getGrainNum() ==-1){
grains.get(grainNum).add(p[j][k+1]);
growthPoints.add(p[j][k+1]);
p[j][k+1].setGrainNum(grainNum);
finGrainGrow = false;
}
}
catch(ArrayIndexOutOfBoundsException t){
}
}
}
}
return grains;
}
我有一个名为Point的对象,它包含5个双精度值和一个int(一个x和y坐标,三个欧拉角,以及一个属于它的粒子的int)。二维点阵列初始化为粒度-1和其他参数的通用值。然后从文件中读取正确的值并保存到适当的点。我试图将相邻的点排序到称为Grain的对象中,这些对象只是Points的ArrayLists。抛出的错误是:
线程中的异常&#34; main&#34; java.lang.ArrayIndexOutOfBoundsException
main方法调用FindGrains方法。它没有给出遇到异常的行号,所以我真的不知道我在做什么。非常感谢任何帮助。
答案 0 :(得分:1)
这肯定与OutOfMemoryException无关。
如果要调用ArrayList的以下任何API,请查看代码中的所有位置: get(index),set(index,data),add(index,data),remove(index),addAll(index,collection),removeRange(fromIndex,toIndex)
您的调试重点应该是使用ArrayList的任何API的代码段。您的代码肯定是在尝试访问不存在的ArrayList实例的索引。