当前位置: 首页 > 知识库问答 >
问题:

邻居不会屈服

蔡楚
2023-03-14

我正在写一个小程序,介绍如何计算网格中给定位置的邻域之和。由于某些原因,程序无法识别正确的值。我想知道这可能是因为我使用了try-catch来限制出界,还是我错过了什么?

我使用的是一个简单的3x3网格,编号为1-9。我在许多其他测试中使用了相同的矩阵,因此假设网格没有问题。即使我在一步一步地调试和检查时得到了11。我不太明白,有人有主意吗?

和中的-1只是将其强制为11(2 4 5),但程序在运行输入位置时仍然产生false。要么是我错过了什么,要么是我不明白什么

{1, 2, 3},
{4, 5, 6},
{7, 8, 9}


out.println(sumNeighbours(matrix, 0, 0) == 11);

int sumNeighbours(int[][] matrix, int row, int col) {
    int sum = -1;
    try {
        for (int i = row - 1; i <= row; i++) {
            for (int j = col - 1; j <= col; j++) {
                sum = sum + matrix[i][j];
            }
        }
    } catch (ArrayIndexOutOfBoundsException e) {
    } return sum;

共有3个答案

孙言
2023-03-14

在第一次迭代中,i和j等于-1,您试图从矩阵[-1][-1]中获取值,然后抛出异常。Catch块是空的,所以不进行任何操作,最后您的程序返回sum(它是-1)。

如果要在异常之后继续迭代,则应执行以下操作:

        for (int i = row - 1; i <= row; i++) {
            for (int j = col - 1; j <= col; j++) {
                try {
                   sum = sum + matrix[i][j];
                }
                catch (Exception e) {
                // do nothing
                }
            }
        }
    } return sum;

在这种情况下,循环中只有添加,所以错误不会停止它。

附言:尽量避免用尝试捕捉来处理这样的情况

壤驷德寿
2023-03-14

我将把它作为一个社区维基发布在这里,以免偏离cOder的答案(顺便说一句,是1),但关键是编写代码以避免运行到AIOOBE,创建循环开始和结束值来防止这种情况发生的事情,比如:

int sumNeighbours(int[][] matrix, int row, int col) {
    int sum = 0;
    
    int iStart = Math.max(0, row - 1);
    int iEnd = Math.min(matrix.length, row + 2);
    for (int i = iStart; i < iEnd; i++) {
        int jStart = Math.max(0, col -1);
        int jEnd = Math.min(matrix[i].length, col + 2);
        for (int j = jStart; j < jEnd; j++) {
            sum += (i == row && j == col) ? 0 : matrix[i][j];
        }
    }
    return sum;
}
东门佐
2023-03-14

简单的打印输出(或更好的:使用调试器)向您显示发生了什么:

int sumNeighbours(int[][] matrix, int row, int col) {

    int sum = 1;
    try {
        for (int i = row - 1; i <= row; i++) {
            for (int j = col - 1; j <= col; j++) {
                System.out.println("Step 1 invalid indecies: i " + i +" j "+j);
                sum = sum + matrix[i][j];
            }
        }
    } catch (ArrayIndexOutOfBoundsException e) {
        System.out.println("Step 2 exiting loop, muted exception");
    }

    System.out.println("Step 3 returning sum "+sum);
    return sum;
}

附带说明:例外只是例外。它们是用来处理特殊情况的。避免使用异常来控制程序。

 类似资料:
  • 问题内容: 我试图将两个s彼此相邻放置在的中心,当改变大小时,它们不会改变按钮的大小。 为此,我将两个按钮放在带有a的面板中,然后将其放在带有中心的面板中。 但是,以下代码不会在的中心显示所选面板。 问题答案: 设置到。 编辑: @trashgod:我必须弄清楚默认约束是如何做到的。 由于存在GridBagLayout.defaultConstraints字段: 此字段包含包含默认值的Gridba

  • 我在支持库的文本输入中包含了一个编辑文本,我发现无法使提示出现在字段的中心。我已经尝试了在其他堆栈溢出讨论中发现的所有常用技巧,正如您从代码示例中看到的那样,但提示仍然顽固地出现在编辑文本的左侧。我该如何解决这个问题? 请不要建议使用paddingLeft或paddingStart来做到这一点——我想要一些能够在不同设备上干净地工作的东西,所以它必须是一个直接的解决方案,而不是一个变通办法。 需要

  • 我在爬的时候遇到了一个问题http://www.brand-in-trend.ru. 正如您在下面看到的,我使用Scrapy并定义了Basespider。第一个解析器工作得非常好,返回在start\u url上找到的所有品牌。 现在,当我想向类别解析器产生回调请求时,我没有得到响应,也没有得到错误。蜘蛛刚刚退出。 蜘蛛网: 我已经尝试了以下方法来解决此问题: 我测试了生成的品牌URL(例如。htt

  • 问题内容: 是否有一种简单的方法来查找二维数组中某个元素的邻居(即,元素周围的八个元素)?缺少只是以不同的组合减去和增加索引,像这样: … 等等。 问题答案: (伪代码) 当然,这几乎要花费原始硬编码解决方案的许多行,但是通过这一解决方案,您可以最大程度地扩展“邻居”(2-3个或更多单元格)

  • 我实际上正在开发contiki os,我想在不使用rpl的情况下建立一个ipv6网络。我的问题是如何在我的无线电范围内发现邻居。我正在寻找6条LOWPAN nd RA/RS/NA/NS信息,但我不知道如何使其发挥作用。我希望我的节点从其中一个路由器获得前缀,然后将udp数据包发送给我的邻居。 提前感谢。

  • 问题内容: 假设我在Redis中有这些对: 键始终是十进制数字。当提供一个数字时,我想在两个方向上获得最接近数字的两个键。 例如,如果我搜索的邻居,则结果集应具有: 这可能吗?我还是Redis的新手,感谢您的帮助。 问题答案: 是和不是同一时间。 为什么是? 唯一的redis数据类型-SORTED SET允许您获取基于十进制的值范围。因此,使用ZRANGEBYSCORE,您可以按分数范围获取值。