-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 座標、3 つのオイラー角、および属する粒子の int) が含まれています。点の 2 次元配列は、-1 の粒子数とその他のパラメーターの一般的な値で初期化されます。次に、正しい値がファイルから読み込まれ、適切なポイントに保存されます。隣接するポイントを、ポイントの単なる ArrayList である Grain というオブジェクトに並べ替えようとしています。スローされるエラーは次のとおりです。

スレッド「メイン」での例外 java.lang.ArrayIndexOutOfBoundsException

メイン メソッドは 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 に答える