二维数组中的超出范围异常

时间:2019-06-19 12:29:34

标签: java arrays double dimensional

试图在二维数组中找到所有偶数之和与所有奇数的乘积。

为什么我遇到以下异常错误?

Exception java. lang. Array Index Out Of Bounds Exception

运行代码时,此异常出现在行if(m[i][j]%2==0)

photo of code

4 个答案:

答案 0 :(得分:2)

导致错误的确切原因是2D数组实际上是一个锯齿形数组,这意味着并非每一行都包含相同数量的元素。实际上,第二行仅包含三个元素,因此当您进行以下if检查时:

if (m[i][j]%2 == 0)

您遇到i=1j=3的异常。

您应该使2D阵列不锯齿,或者使用以下for循环:

for (int i=0; i < 4; ++i) {
    for (int j=0; j < m[i].length; ++j) {
            if (m[i][j]%2 == 0) {
                s += m[i][j];
            }
            else {
                r *= m[i][j];
            }
        }
    }
}

答案 1 :(得分:1)

您的m数组在索引1处的元素缺少第四个元素:

{30,11,71}

答案 2 :(得分:1)

请勿用作限制固定值(例如4),而使用 {{ 1}}

length

为什么?

并非所有内部数组都具有4个元素(即:for (int i = 0; i < m.length; i++) { for (int j = 0; j < m[i].length; j++) { //... } } ),因此在内部循环的最后一次迭代({30, 11, 71})中,此代码j = 3尝试访问一个值数组的边界,因为在某些情况下,没有位置m[i][j],只有3(第一个元素),0(第二个元素)和1(第三个元素) 。这样就得到了提到的异常。

旁注

另一个问题(mentioned by you)是因为总是将2初始化为r = 0,所以每次都会得到0,并且每次将其值乘以另一个值,结果将是{{ 1}}。

因此,要解决此问题,您需要在0条件下添加一个检查,如下所示:

else

答案 3 :(得分:0)

i < 4替换为i < m.length,将j < 4替换为j < m[i].length