3x3网格指定位置邻居求和程序返回结果不符预期的问题排查求助
看起来你遇到的问题主要是循环范围错误和try-catch隐藏异常导致循环提前终止,再加上初始值设计逻辑不够严谨,咱们一步步拆解:
核心问题分析
try-catch的致命干扰:
当计算(0,0)位置的邻居时,循环初始i = row-1 = -1、j = col-1 = -1,第一次访问matrix[-1][-1]就会抛出ArrayIndexOutOfBoundsException。而你的catch块只是捕获异常却没有任何后续处理,这会直接终止整个try块的执行——也就是说,后面所有合法的循环(比如i=0,j=1、i=1,j=0这些有效位置)都根本没机会运行!这时候sum的结果大概率不是你调试时看到的11,而是初始值-1(因为异常抛出时,sum = sum + matrix[i][j]这行代码根本没执行完成)。循环范围不完整:
你当前的循环只遍历了row-1到row、col-1到col的范围,这只覆盖了当前位置的左上、左、上、自身这几个位置,完全漏掉了右侧和下方的邻居(比如i=1,j=0、i=1,j=1这些应该被计算的关键位置)。初始值设计逻辑不合理:
用sum = -1来抵消自身元素的思路很容易出错——一旦循环范围或判断逻辑有问题,这个初始值会直接干扰最终结果,而且代码可读性极差。
排查思路与修正方案
第一步:移除try-catch,暴露真实错误
try-catch在这里相当于“遮羞布”,它隐藏了数组越界的问题,让你无法知道循环为什么没按预期执行。先把try-catch删掉,运行程序时就能看到明确的异常信息,确认是非法索引导致的问题。
第二步:修正循环范围,主动判断索引合法性
正确的邻居遍历应该覆盖当前位置的上下左右及对角线,也就是i从row-1到row+1,j从col-1到col+1。同时,我们要主动判断索引是否在数组的有效范围内(避免越界),并且跳过当前位置本身(如果不需要把自身计入邻居和的话)。
修正后的代码如下:
int sumNeighbours(int[][] matrix, int row, int col) { int sum = 0; // 遍历当前位置周围3x3的所有位置 for (int i = row - 1; i <= row + 1; i++) { for (int j = col - 1; j <= col + 1; j++) { // 跳过当前位置,同时跳过数组越界的位置 if ((i == row && j == col) || i < 0 || i >= matrix.length || j < 0 || j >= matrix[0].length) { continue; } sum += matrix[i][j]; } } return sum; }
第三步:验证结果
对于你的3×3网格,调用sumNeighbours(matrix, 0, 0)时:
- 会跳过所有越界的索引(
i=-1或j=-1的情况),以及当前位置(0,0) - 只累加有效邻居:
matrix[0][1](2)、matrix[1][0](4)、matrix[1][1](5) - 最终返回
2+4+5=11,和你的预期一致,此时out.println(sumNeighbours(matrix, 0, 0) == 11);会返回true。
额外调试技巧
如果还是不确定问题出在哪,可以在循环内部添加打印语句,输出每次循环的i、j值以及当前的sum,这样就能清晰看到哪些元素被加进去了,哪些被跳过了:
// 在sum += matrix[i][j];之前添加 System.out.printf("Adding matrix[%d][%d] = %d, current sum: %d%n", i, j, matrix[i][j], sum);
内容的提问来源于stack exchange,提问作者Muguwaranojar

