二维数组边界检查必须先判空再校验索引:array==null || array.length==0 || array[0]==null || array[0].length==0时拒绝访问;行索引∈[0, array.length),列索引∈[0, array[i].length)且array[i]!=null。

二维数组的边界检查核心就一条:任何索引访问前,必须确认行号和列号落在合法范围内。不检查就直接用,轻则程序报错崩溃,重则数据错乱或安全漏洞。
明确数组维度再校验
二维数组的合法行索引是 0 到 array.length - 1,合法列索引是 0 到 array[0].length - 1(前提是 array 不为空且首行存在)。不能只查 array.length,忽略 array[0] 可能为 null 或长度为 0 的情况。
- 先判空:if (array == null || array.length == 0 || array[0] == null || array[0].length == 0) → 直接拒绝访问
- 再校验:row ≥ 0 && row
- 把校验逻辑封装成独立方法,比如 isValidIndex(int row, int col, int[][] arr),复用性高、不易漏
邻居访问必须逐方向判断
处理上下左右四个邻居时,不能“先算坐标再访问”,而要“先判坐标是否合法,再取值”。例如访问上方元素,不能写 array[row-1][col],而应先判断 row-1 ≥ 0。
- 每个方向单独检查:上 → row > 0;下 → row 0;右 → col
- 避免合并条件导致短路失效,比如 if (row > 0 && array[row-1][col] == 1) 是危险写法——若 row ≤ 0,array[row-1][col] 不会执行,但逻辑上仍隐含了越界风险意识
- 推荐写法:if (row > 0) { check neighbor above };清晰、可调试、易扩展
遍历过程中动态维护边界
像螺旋遍历、层序扩散这类算法,边界(top/bottom/left/right)会变化,仅靠初始尺寸不够,必须在每步操作后重新评估当前剩余区域是否有效。
- 每次收缩边界后,立即检查是否交叉:if (left > right || top > bottom) → 提前终止
- 单行或单列场景需单独处理:如 left == right 时,只遍历从 top 到 bottom 的列;top == bottom 时,只遍历从 left 到 right 的行
- 避免在 for 循环条件里硬编码 array.length,改用当前维护的边界变量
空数组与稀疏结构提前兜底
二维数组未必是规则矩形——可能某几行长度不同,甚至某行为 null。通用边界检查必须兼容这种非规则结构。
- 访问 array[i][j] 前,确保 i 在 [0, array.length) 内,且 array[i] != null,且 j 在 [0, array[i].length) 内
- 对不规则二维结构(如 ArrayList
>),用 size() 替代 length,逻辑一致:row - 测试用例中务必包含:空数组、单行、单列、首行为 null、中间某行为 null 等边界样本











