-2
public class mdar {
    public void cont(){
        Random rand = new Random();
        int con = 100;
        int multi[][]=new int [con][6];
        for(int x = 0;x<multi.length;x++){
            for(int y = 0;y<multi[x].length;y++){
                int temp = rand.nextInt(9);
                multi[x][y] = multi[x+1][temp];    //this line is going bad
            }
        }
        for(int i=0;i<multi.length;i++){
            System.out.print("contester "+multi[i]);
            for(int j=0;j<multi[i].length;j++){
                System.out.println(" has "+multi[i][j]+" ");                
            }
            System.out.println();
        }
    }
}

古いプロジェクトを削除したので、作り直そうとしましたが、もうわかりません:S 誰か助けてくれませんか?

4

8 に答える 8

4

の 2 番目の次元multiは 6 です。

int multi[][]=new int [con][6];

ただし、その2番目の次元で最大8まで何でも呼び出します

 int temp = rand.nextInt(9);
 multi[x][y] = multi[x+1][temp]; //temp could be between 0 and 8 from the random function

そのため、範囲外の配列インデックスを取得します。この場合、temp は 7 でした。

さらに、ループは 0 からmulti[x].length-1

for(int y = 0;y<multi[x].length;y++){

しかし、ループの最後に which を呼び出すmulti[x+1]と、 multi の最大インデックスよりも 1 つ大きくなりますが、この例外は他のものの後に発生します (99% の時間)。

multi[x][y] = multi[x+1][temp]; 
于 2013-09-30T09:27:39.233 に答える
3

コードが何をするべきかを考えなければ、解決策を示すのは困難です。エラーは非常に明確です。外側のループの最後の反復を参照してくださいx = multi.length - 1。したがって、あなたが尋ねるとき、 multi は から行くので、どれが範囲外であるmulti[x+1][temp]かを尋ねています。multi[multi.length][0 to multi.length-1]

それに加えてint temp = rand.nextInt(9)、multi の 2 番目の次元が範囲内にある必要があるため、値 6、7、または 8 を返す場合にも範囲外の例外が発生します。[0 to 5]

繰り返しますが、何をする必要があるのか​​ わからないため、以下で提案するソリューションがあなたのやりたいことを実行するかどうかはわかりません。

    for(int x = 0;x<multi.length - 1;x++){
        for(int y = 0;y<multi[x].length;y++){
            int temp = rand.nextInt(multi[x+1].length);
            multi[x][y] = multi[x+1][temp];
        }
    }
于 2013-09-30T09:27:14.833 に答える
3

私はあなたが書くつもりだったと思います

multi[x][y] = temp;
//This would set multi[x][y] to a random int in the range [0,8] (inclusive)

それ以外の

multi[x][y] = multi[x+1][temp];    //this line is going bad
//This will assign the int value at multi[x+1][temp] to the variable multi[x][y]

これには 2 つの問題があります: 1) x は範囲 [0,multi.length) [inclusive, exclusive) の for ループ カウンターです。

for(int x = 0;x<multi.length;x++)

x+1 は配列の範囲外です

2) temp は範囲 [0,8] [包括的、包括的] のランダムな int です。

int temp = rand.nextInt(9);

ただし、マルチ配列は 2 次元サイズ 6 で定義されます (有効な位置multi[x][0]は までmulti[x][5]) 。

int multi[][]=new int [con][6];

確率変数 temp は 3/9 回 (6、7、8 の場合) 有効な範囲外になるため、nextInt(9) が呼び出される時間の 33% でこのエラーが発生します。cont() への 1 回の呼び出しで何度も呼び出されるため、エラーなしで実行されることはほとんどありませんが、エラーの有無にかかわらず、依然として論理的に正しくないコードです。

于 2013-09-30T09:27:50.690 に答える
2

あなたの

int temp = rand.nextInt(9);

「7」として値を与えます。このエラーが発生しています。デバッグして見つけます。

于 2013-09-30T09:29:01.070 に答える
1
 multi[x][y] = multi[x+1][temp]; 

ループ x+1 の最後でそれを作ります。

于 2013-09-30T09:27:24.153 に答える
1

配列の長さを超えている場合は、次のことを試してください。

if(x+1 < multi.length)
{
multi[x][y] = multi[x+1][temp]; 
}
于 2013-09-30T09:27:14.250 に答える
1

2 番目の次元 6 で 2D 配列を宣言しています。

int multi[][]=new int [con][6];

2 番目の次元の有効なインデックスは 0..5 の範囲になります。ただし、範囲外の 7 などの乱数でアクセスします。

int temp = rand.nextInt(9);
multi[x][y] = multi[x+1][temp];    //this line is going bad
于 2013-09-30T09:29:03.443 に答える
0
int temp = rand.nextInt(9);
                System.out.println(temp);
                multi[x][y] = multi[x+1][temp]; 

ここで、temp が 5 を超えると、例外が発生します。multi[][]=new int [con][6];

行を変更するint temp = rand.nextInt(5);

また、別の問題がありmulti[x+1]ます。x=99 の場合、問題の原因となっている 100 を作成しようとします。配列インデックスは 0 から始まることを覚えておいてください。

于 2013-09-30T09:35:42.550 に答える