试图在二维数组中找到所有偶数之和与所有奇数的乘积。
为什么我遇到以下异常错误?
Exception java. lang. Array Index Out Of Bounds Exception
运行代码时,此异常出现在行if(m[i][j]%2==0)
答案 0 :(得分:2)
导致错误的确切原因是2D数组实际上是一个锯齿形数组,这意味着并非每一行都包含相同数量的元素。实际上,第二行仅包含三个元素,因此当您进行以下if
检查时:
if (m[i][j]%2 == 0)
您遇到i=1
和j=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