【问题标题】:Out of bounds exception in double dimensional array二维数组中的越界异常
【发布时间】:2019-11-02 04:39:10
【问题描述】:

试图在一个二维数组中找到所有偶数的总和和所有奇数的乘积。

为什么会出现以下越界异常错误?

Exception java. lang. Array Index Out Of Bounds Exception

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

【问题讨论】:

标签: java arrays double dimensional


【解决方案1】:

您的错误的确切原因是您的二维数组实际上是一个 锯齿形 数组,这意味着并非每一行都包含相同数量的元素。其实第二行只包含三个元素,所以当你下面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];
            }
        }
    }
}

【讨论】:

  • 由于某种原因,我得到变量 r 的结果为零,有什么解决方案吗?
  • @JohnDoe 这是一个不同的问题。原因是你正在初始化r = 0,所以无论你乘以什么值,结果总是0。即:0 * 23 = 0,对吗?
  • 程序现已成功运行,感谢您的及时帮助
【解决方案2】:

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

{30,11,71}

【讨论】:

    【解决方案3】:

    不要将固定值用作限制(例如4),而是使用 length 由数组提供。

    for (int i = 0; i < m.length; i++) {
        for (int j = 0; j < m[i].length; j++) {
          //...
        }
    }
    

    为什么?

    并非所有内部数组都有 4 个元素(即:{30, 11, 71}),因此在内部循环的最后一次迭代(j = 3)中,此代码 m[i][j] 尝试访问数组边界之外的值因为在某些情况下没有位置3,只有0(第一个元素)、1(第二个元素)和2(第三个元素)。因此,您会得到上述异常。

    旁注:

    另一个问题(mentioned by you)是你总是会得到r = 0,因为它被初始化为0,每次你将它的值乘以另一个值,结果将是0。

    因此,为了解决此问题,您需要在 else 条件中添加检查,如下所示:

    else {
        r = r == 0 ? m[i][j] : r * m[i][j];
    }
    

    【讨论】:

    • @JohnDoe 很高兴您现在可以使用它!考虑将答案标记为accepted,以便未来的读者知道问题已解决。
    猜你喜欢
    • 1970-01-01
    • 2013-05-01
    • 1970-01-01
    • 2014-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-04
    • 1970-01-01
    相关资源
    最近更新 更多