【问题标题】:Java arrays error (not out of bounds) [duplicate]Java数组错误(未超出范围)[重复]
【发布时间】:2017-09-05 16:34:37
【问题描述】:

我正在通过 Codefights 网站研究 Java。这是练习:

成名后,CodeBots 决定搬到新大楼住在一起。建筑物由一个矩形矩阵表示 房间,每个单元格包含一个整数 - 房间的价格。一些 房间是免费的(他们的费用是 0),但这可能是因为他们是 闹鬼,所以所有的机器人都害怕它们。这就是为什么任何房间 是免费的或位于同一列中空闲房间下方的任何位置 不适合机器人。帮助机器人计算 适合他们的所有房间的总价。例子: 对于

matrix = [[0, 1, 1, 2], 
          [0, 5, 0, 0], 
          [2, 0, 3, 3]]

输出应该是matrixElementsSum(matrix) = 9。这是带有“x”标记的不合适房间的房间矩阵:

[[x, 1, 1, 2],
 [x, 5, x, x],
 [x, x, x, x]]

因此,答案是 1 + 5 + 1 + 2 = 9。

我知道我必须遍历数组的所有元素,这很容易。我挂断的部分是检查数组中当前元素上方的“0”房间。我知道那个位置是matrix[i-1][j],数组中的当前位置是matrix[i][j]。但是,当我尝试实现它时,我收到了错误“InvocationTargetExeption”。

我的假设是我在数组地址中要求负数,但我不确定如何解决这个问题。这是我的代码:

int matrixElementsSum(int[][] matrix) {
    int sum = 0;
    for(int i = 0; i < matrix.length; i++){
        for(int j = 0; j < matrix[i].length; j++){
            if(matrix[i-1][j]==0){ sum += 0;}   
            else{sum += matrix[i][j];}
                }
        }
    return sum;
}

【问题讨论】:

  • 它仍然可能是一个 AIOOBE。您需要检查堆栈跟踪的其余部分(并在此处发布)。
  • 你让 i 从 0 开始,并且你在 if 语句中使用 i-1,所以当 i = 0 时,你正在调用 matrix[-1]
  • 使用 i==0 您尝试在导致异常的 if 语句中访问 matrix[-1]。您如何调用此代码?似乎有一些围绕这个的框架。异常应该以“Caused by”继续,迟早应该有一个 ArrayIndexOutOfBoundsException 或类似的东西

标签: java arrays indexoutofboundsexception


【解决方案1】:

一个ArrayIndexOutOfBoundsException,你可以通过替换来修复它:

if(matrix[i-1][j]==0){ sum += 0;}

与:

if(i > 0 && matrix[i-1][j]==0){ sum += 0;}

您得到它是因为您尝试访问:matrix[i-1][j] 并且当 i=0 时 i-1 = -1...

在您提供的示例中在矩阵上运行固定代码,按预期返回 9。

我能想到的唯一原因是,您看到InvocationTargetException 是如果您使用反射调用matrixElementsSum:那么该方法会抛出一个由InvocationTargetException 包装的ArrayIndexOutOfBoundsException

来自Method.java 文档字符串:

* @exception InvocationTargetException if the underlying method
*              throws an exception.

【讨论】:

  • 哦,太好了! and 语句意味着如果 i 为负数,则即使地址为负数,也不会引用矩阵,所以也不例外。感谢您的帮助,但现在我们该怎么办,因为我们还必须评估上方房间上方的房间。这意味着如果 i 只是 1,也会引发相同的异常,因为 1 - 2 仍然是负数。
  • 我正在考虑另一个 if 语句,使用 i > 1 和 [i-2] 嵌套在第一个 if 中?
  • 再次感谢您的帮助。第二个 if 语句有效。 Codefights 的一个小问题是,在解决问题之前,您看不到任何解决方案。我想这是有道理的,但有时我想知道卡住是否比查看一个好的答案并在继续之前消化它更有效。另一方面,有时您在研究中获得的实践可能与实践编码一样有价值。谢谢大家! o7
猜你喜欢
  • 2016-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-11
  • 1970-01-01
相关资源
最近更新 更多