Java多维数组越界需分层校验:先检查外层数组索引合法,再确认内层数组存在且其索引合法;如int[][] matrix = {{1,2},{3,4,5}},matrix0因内层长度不足越界,matrix2因外层索引超限更早抛出ArrayIndexOutOfBoundsException。

Java多维数组越界不是单个索引问题,而是分层访问过程中的双重风险——先要确保外层数组索引合法,再确认内层数组存在且其索引也合法。只要任一环节出错,就会抛出 ArrayIndexOutOfBoundsException。
二维数组必须做两层独立校验
像 int[][] matrix = {{1,2},{3,4,5}}; 这样的不规则二维数组,matrix[0][2] 会越界(第一行只有2个元素),而 matrix[2][0] 更早一步就失败(总共只有2行)。所以安全访问不能只查一次长度。
- 先判断
i >= 0 && i :确认行索引有效 - 再判断
matrix[i] != null && j >= 0 && j :确认该行非空、列索引有效 - 缺一不可。跳过 null 检查可能触发
NullPointerException;跳过内层数组长度检查则直接越界
避免硬编码尺寸,动态获取每维长度
不要写 matrix[3][5] 这类固定下标,尤其当数组来自外部输入或计算结果时。Java 数组不保存“列数”这个全局概念,每行长度可以不同。
- 用
matrix.length获取行数 - 用
matrix[i].length获取第 i 行的列数(前提是matrix[i] != null) - 如果业务要求矩形结构,应在初始化后统一校验,而不是靠经验假设
用增强 for 循环替代索引遍历(当不需要坐标时)
如果只是逐个处理所有元素,不用知道当前是第几行第几列,增强 for 可彻底规避越界风险。
立即学习“Java免费学习笔记(深入)”;
for (int[] row : matrix) { for (int val : row) { /* 处理 val */ } }- JVM 自动控制迭代边界,不会访问到不存在的行或列
- 适合聚合、过滤、打印等只读场景
封装安全访问方法,复用校验逻辑
重复写两层 if 容易遗漏,建议提取为工具方法,把边界检查变成调用一句话的事。
- 例如:
safeGet(matrix, i, j)内部完成全部校验,返回Optional<Integer>或抛出带上下文的异常 - 也可返回默认值(如 0 或 -1),适用于容错要求高的场景
- 测试时可覆盖
i=-1、i=matrix.length、j=matrix[0].length等典型越界点


















