标量乘法 - 数组索引超出界限异常

时间:2012-09-25 06:40:38

标签: java exception indexoutofboundsexception

public static int[][] scalarMultiplication(int[][] A,int num) {
    int[][] arrayScalarMul = new int[A.length][A[0].length];

    for (int x=0; x < arrayScalarMul.length; x++) {
        for (int y=0; y < arrayScalarMul[x].length; y++) {
            arrayScalarMul[x][y] = A[x * num][y * num];
        }
    }
    return arrayScalarMul;
}

正如标题所说我收到了ArrayIndexOutOfBoundsException错误,我看到有些人通过将长度缩短1来修复它,我只是不明白为什么需要它?

3 个答案:

答案 0 :(得分:5)

arrayScalarMul[x][y] = A[x * num][y * num]; 

将其更改为

arrayScalarMul[x][y] = num * A[x][y]; 

您将索引与给定标量相乘,但您应该乘以该索引上的值。

答案 1 :(得分:1)

错误是因为

arrayScalarMul [x] [y] = A [x * num] [y * num];

当与x(或y)相乘时,

num使其超出界限。

index-1终止通常用于防止“off by 1 error”,因为你有一个基于0的数组,所以一个大小为n的数组实际上有一个介于0和n-1之间的有效索引。所以我们要么使用&lt;的循环条件。 n或&lt; = n-1。情况并非如此。

如果你的意图是用A [x * num] [y * num]替换A [x] [y]的值,如果这是一个有效的索引,那么添加一个像此

if(x*num - totalx) && (y*num - totaly)
   A[x][y] = A[x*num][y*num];

答案 2 :(得分:0)

长度缩短1 也不起作用,因为num在这里是可变的。

arrayScalarMul[x][y] = A[x * num][y * num];

它产生java.lang.ArrayIndexOutOfBoundsException。这里* x * num *和 y num *超出了数组索引。