我将在40分钟后完成此作业...我将其提交给此在线内容,并测试方法等,我收到此错误。我知道什么是出界的,但我不知道它在指定的代码中发生了什么:
public int countNeighbours(int x, int y) {
int neighbourCount = 0;
for (int i = 0; i < cells.length; i++) {
for (int j = 0; j < cells.length; j++) {
if ((cells[x][y].isAlive() == true) && (x < cells.length) && (y < cells.length) && (x >= 0)
&& (y >= 0)) {
neighbourCount++;
}
else if ((cells[x][y].isAlive() == false) && (x < cells.length) && (y < cells.length) && (x >= 0)
&& (y >= 0)) {
neighbourCount--;
}
else if (!(x < cells.length) || !(y < cells.length) || !(x >= 0) || !(y >= 0)) {
return 0;
}
else {
neighbourCount = neighbourCount;
}
}
}
return neighbourCount;
}
我不知道它是否真的有效,我有不同的代码,但有问题。
无论如何,在线事物基本上测试无效坐标并确保我的代码返回无效坐标的正确值(即返回0)。
所以我不知道为什么会出现越界错误,我觉得我已经完全指定了界限。
我也有一个子问题,它也没有测试,其中单元格有8个邻居,但我的代码返回-9。所以显然它只能通过返回neighbourCount的那个 - 但我真的不明白为什么。我错过了规格中的某些内容吗?或者它可能与我的代码中完全不同的部分有关。
答案 0 :(得分:2)
表达式从左到右进行评估,因此在访问x
之前,您应该检查y
和cell[x][y]
的值是否在有效范围内:
if ((x < cells.length) && (y < cells.length) && (x >= 0)
&& (y >= 0) && (cells[x][y].isAlive() == true))
顺便说一下,这个测试假设cells
是一个方阵(即它有相同数量的列和行)。
PS,目前还不清楚为什么要对i
和j
进行迭代,然后不要在循环中使用它们。