-3

我在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 个 double 值和一个 int(一个 x 和 y 坐标、三个欧拉角以及它所属的颗粒的一个 int)。点的二维数组使用 -1 的粒度数和其他参数的通用值进行初始化。然后从文件中读取正确的值并保存到适当的点。我正在尝试将相邻的点分类为名为 Grain 的对象,这些对象只是点的 ArrayLists。抛出的错误是:

线程“主”java.lang.ArrayIndexOutOfBoundsException 中的异常

main 方法调用 FindGrains 方法。它没有给出遇到异常的行号,所以我真的不知道我在做什么。很感谢任何形式的帮助。

4

1 回答 1

1

这当然与 OutOfMemoryException 无关。

如果您正在调用 ArrayList 的以下任何 API,请查看代码中的所有位置:get(index), set(index, data),add(index, data), remove(index), addAll(index, collection ), removeRange(fromIndex, toIndex)

您的调试重点应该围绕您使用任何这些 ArrayList API 的代码。您的代码肯定会尝试访问不存在的 ArrayList 实例的索引。

于 2011-10-12T03:27:15.900 回答