二维数组校验核心是确保访问安全,需先判空(array==null||array.length==0||array[0]==null||array[0].length==0),再分层验证索引范围,遍历中动态边界须实时校验。

二维数组校验不是“检查值对不对”,而是“确认访问是否安全”。核心在于:任何一次 array[i][j] 操作前,必须确保 i 和 j 都落在合法范围内,且中间层级非空。不提前校验,轻则抛 ArrayIndexOutOfBoundsException 或 NullPointerException,重则逻辑错乱或被利用绕过权限。
先判空,再查维度
二维数组可能为空、某行为 null、某行长度为 0——它不一定是规则矩形。安全访问的第一步永远是兜底判空:
-
空数组:
array == null || array.length == 0 -
首行缺失:
array[0] == null -
首行为空:
array[0].length == 0
四者任一成立,就应拒绝后续所有索引访问。不要跳过 array[0] == null 这一步——尤其在读取外部数据或动态构造数组时,中间行为空很常见。
索引范围必须分层验证
合法行索引是 0 ≤ i ;但合法列索引不是统一的 <code>0 ≤ j ,而是针对每一行单独判断:<code>0 ≤ j ,且前提是 <code>array[i] != null。
- 错误写法:
if (i >= 0 && i = 0 && j (忽略 <code>array[i]可能为null) - 正确写法:
if (i >= 0 && i = 0 && j
推荐封装成工具方法:static boolean isValid(int i, int j, int[][] arr),避免重复逻辑和遗漏。
邻居访问必须方向隔离
处理上下左右四个邻居时,“先算坐标、再访问”是高危操作。例如想取上方元素,不能写 array[i-1][j],而要先单独判断 i > 0。
- 上:只检查
i > 0 - 下:只检查
i - 左:只检查
j > 0 - 右:只检查
j (且确认 <code>array[i] != null)
每个方向独立判断,不合并条件(如 if (i > 0 && array[i-1][j] == 1) 是危险写法),便于调试、扩展和单元测试覆盖。
遍历中边界动态变化需实时重检
螺旋遍历、层序扩散等算法会收缩上下左右边界。仅靠初始 array.length 和 array[0].length 不够,必须维护并持续校验当前有效区域:
- 每次移动边界后,立即检查是否交叉:
if (top > bottom || left > right)→ 提前终止 - 单行(
top == bottom)时,只遍历列区间[left, right] - 单列(
left == right)时,只遍历行区间[top, bottom] - 循环条件中禁用硬编码
array.length,改用当前变量如while (top
不维护动态边界,会在收缩到最后一行/列时越界或漏数据。
用户输入场景需叠加类型与语义校验
当用户输入映射为数组索引(如选座位、填坐标),除边界检查外,还需两层防护:
-
类型校验:用
Scanner.hasNextInt()防InputMismatchException,避免非数字输入中断流程 - 语义转换:用户习惯从 1 开始编号(第 1 行),需转为 0 基索引,再做上述边界检查
-
异常友好化:抛出自定义异常(如
ArrayInputMismatchException),附带明确提示:“行号应在 1–" + array.length + " 之间”
不要依赖 try-catch ArrayIndexOutOfBoundsException 做主校验——它是崩溃信号,不是业务逻辑分支。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











