必须每维独立校验索引合法性,因java原生多维数组不存维度元数据,jvm仅单层检查,越界异常延迟暴露;如int3需分别验证i∈[0,2]且j∈[0,3]。

Java 多维数组遍历中索引越界不能靠“运气”避开,必须每维独立校验、每处访问前设防。原生多维数组(如 int[][])不保存维度元数据,JVM 仅在运行时对每次 a[i][j] 做单层检查,中间某维越界才抛异常——这意味着错误可能延迟暴露,逻辑已错而程序未崩,隐患更大。
按维度逐层校验索引合法性
二维数组 int[][] matrix = new int[3][4] 的合法访问范围是:行索引 i ∈ [0, 2],列索引 j ∈ [0, 3]。二者缺一不可,且必须分开判断:
- 先确认
matrix != null && i >= 0 && i —— 防空指针和行越界 - 再确认
matrix[i] != null && j >= 0 && j —— 防空行和列越界 - 若用
matrix[i][j]前跳过任一检查,哪怕i合法,matrix[i]为null或长度不足,仍会抛NullPointerException或ArrayIndexOutOfBoundsException
避免手动偏移计算,拒绝“扁平化”模拟
不要把二维当一维算下标,例如写成 matrix[i * cols + j] 或用指针思维硬编码步长。Java 没有指针算术,这种写法既无意义又极易出错:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
cols可能与实际每行长度不符(不规则二维数组常见) - 一旦
i或j来自用户输入、配置或计算结果,偏移公式本身就会越界 - 正确做法始终用
matrix[i][j]语法,并配合上述双层校验
封装安全访问方法,统一守门逻辑
重复写校验代码易遗漏,建议提取为工具方法,让业务代码聚焦逻辑:
- 定义
safeGet(matrix, i, j):返回Optional<integer></integer>或抛定制异常,内部完成全部判空与范围检查 - 对稀疏或可能含
null行的场景,校验必须包含matrix[i] != null,不能只信matrix.length - 若需默认值(如越界返回 0),用
safeGetOrElse(matrix, i, j, 0),而非在业务层补 try-catch
测试覆盖关键边界组合
单元测试要主动“找茬”,不能只测正常流程:
- 空数组:
new int[0][0]、new int[3][0]、new int[0][5] - 单行/单列:
new int[1][10]访问[0][9]和[0][10] - 负索引试探:
matrix[-1][0](直接报错)、matrix[matrix.length - 1][0](应合法) - 动态构造场景:先
matrix = new int[2][3],再某行被重置为null,再访问该行
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










