我正在写一个小程序,介绍如何计算网格中给定位置的邻域之和。由于某些原因,程序无法识别正确的值。我想知道这可能是因为我使用了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;
在第一次迭代中,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;
在这种情况下,循环中只有添加,所以错误不会停止它。
附言:尽量避免用尝试捕捉来处理这样的情况
我将把它作为一个社区维基发布在这里,以免偏离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;
}
简单的打印输出(或更好的:使用调试器)向您显示发生了什么:
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,您可以按分数范围获取值。