0
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 来修复它,我只是不明白为什么需要这样做?

4

3 回答 3

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

将其更改为

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

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

于 2012-09-25T06:42:48.937 回答
1

错误是因为

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

num 与 x(或 y)相乘时会超出范围。

index-1 终止通常用于防止“关闭 1 错误”,因为您有一个基于 0 的数组,因此大小为 n 的数组实际上将具有介于 0 和 n-1 之间的有效索引。所以我们要么使用 < n 或 <= 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];
于 2012-09-25T06:43:16.070 回答
0

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

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

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

于 2012-09-25T06:49:48.983 回答