java二维数组长度是分层结构:行数用array.length获取,列数需按行取array[i].length;空数组或不规则数组须校验索引有效性,否则易引发空指针或越界异常。

Java 二维数组的长度不是单一值,而是分层结构:外层数组长度代表行数,内层数组长度代表每行的列数。忽视这种分层特性,是空指针、越界异常和逻辑错误的常见根源。
明确区分行数与列数的获取方式
二维数组本质上是“一维数组的数组”,因此不能用统一方式获取行列长度:
-
行数始终通过
array.length获取,这是安全且确定的 -
列数没有全局值——
array[0].length只反映第一行长度,仅适用于规则数组;不规则数组中每行长度可能不同 - 若需统计某一行的元素个数,必须指定行索引:
array[i].length,且前提是i在有效范围内 - 对空二维数组(
array == null或array.length == 0),直接调用array[0].length会抛出NullPointerException或ArrayIndexOutOfBoundsException
不规则数组必须逐行校验长度
当二维数组各行长度不一致(如学生成绩表中每人科目数不同),不能假设所有行列数相同:
- 初始化时需显式为每行分配空间,例如:
int[][] jagged = new int[3][]; jagged[0] = new int[2]; jagged[1] = new int[4]; - 访问任意元素前,必须双重校验:
i = 0 && j = 0 - 遍历时避免硬编码列边界,应使用
for (int j = 0; j 而非 <code>for (int j = 0; j - 封装安全访问方法,例如:
safeGet(array, i, j)内部完成全部边界检查并返回默认值或抛出自定义异常
遍历策略需匹配数组结构
遍历方式直接影响代码可读性与运行健壮性:
- 行优先遍历(外层循环行、内层循环列)最通用,缓存友好,适用于所有二维数组
- 列优先遍历仅在规则数组中可行;若强行用于不规则数组,需动态计算每列实际可访问的行数,否则易越界
- 增强 for 循环适合按行处理,但无法直接获取行列索引:
for (int[] row : array) { ... } - 对稀疏或特殊结构(如三角矩阵),优先采用基于实际数据分布的逻辑遍历,而非机械套用双层 for
避免常见健壮性陷阱
很多崩溃源于对二维数组底层模型理解偏差:
- 误认为
array.length是“总元素个数”——它只是行数;总元素需累加各array[i].length - 将二维数组当作“真正的矩阵”处理,忽略其引用数组本质,导致浅拷贝误用或意外共享
- 未处理
null行:即使i在[0, array.length)内,array[i]仍可能为null,须额外判空 - 返回二维数组时不复制内容,直接暴露内部引用,使调用方修改影响原始数据;应考虑防御性拷贝或不可变封装
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











