-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();
        }
    }
}

I deleted my old project and so i was trying to remake it and i can't figure it out anymore :S Could someone help me out here?

4

8 回答 8

4

的第二维multi是6;

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

但是,您在第二个维度上最多调用 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++){

但是你调用multi[x+1]which 将在循环结束时比 multi 的最大索引大一个,但是你会在另一个之后遇到这个异常(99% 的时间)

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

如果不知道代码应该做什么,我们很难给出解决方案。错误很明显。请参阅外循环的最后一次迭代x = multi.length - 1。因此,当您询问时,multi[x+1][temp]您询问的是multi[multi.length]哪个超出范围,因为 multi 来自[0 to multi.length-1].

除此之外,int temp = rand.nextInt(9)如果它返回值 6,7 或 8 也会导致越界异常,因为 multi 的第二维必须在范围内[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]

这有两个问题:1)x 是 [0,multi.length) [包括,不包括)范围内的 for 循环计数器

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

x+1 在数组的边界之外

2) temp 是 [0,8] [inclusive, inclusive] 范围内的随机 int

int temp = rand.nextInt(9);

但是,多数组定义为第二维大小为 6(有效位置multi[x][0]multi[x][5]

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

随机变量 temp 将超出有效范围 3/9 次(对于 6、7、8),因此在调用 nextInt(9) 的时间中,您将遇到此错误的 33%。由于它在一次调用 cont() 中被多次调用,因此您几乎永远不会有一个运行没有错误的执行,但是,无论执行是否有错误,它在逻辑上仍然是不正确的代码。

于 2013-09-30T09:27:50.690 回答
2

当你的

int temp = rand.nextInt(9);

给出值为“7”。您收到此错误。调试和查找。

于 2013-09-30T09:29:01.070 回答
1

您超出了数组的长度,请尝试执行以下操作:

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

在循环 x+1 结束时。

于 2013-09-30T09:27:24.153 回答
1

您正在使用第二维 6 声明您的 2D 数组:

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

第二维的有效索引将在 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]; 

在这里,当温度超过 5 时,它会给你例外multi[][]=new int [con][6];

换行int temp = rand.nextInt(5);

你还有另一个问题multi[x+1],当你有 x=99 时,它会尝试使 100 导致问题,记住数组索引从 0 开始

于 2013-09-30T09:35:42.550 回答