java二维数组长度管理核心在于区分arr.length(行数)和arr[i].length(第i行列数),后者需先判空;不规则数组须动态逐行初始化,遍历时双层循环必须分别检查行非空和列边界。

Java二维数组的长度管理,直接决定程序是否健壮。关键不是记住几个length,而是理解“外层数组长度”和“每行独立长度”的分离逻辑——尤其在不规则数组中,混淆二者必然引发NullPointerException或ArrayIndexOutOfBoundsException。
区分两个length:行数 vs 每行列数
二维数组arr本质是“一维数组的数组”。因此:
-
arr.length表示总行数(外层数组元素个数),永远安全,不会空指针 -
arr[i].length表示第i行的列数,但前提是arr[i] != null;若该行为null或未初始化,直接访问会抛出异常 - 不存在
arr.length()——数组只有属性length,不是方法;而String才有length()方法
创建阶段就规避隐患
动态创建不规则数组时,必须显式为每一行分配空间,不能依赖默认值:
- 正确写法:
int[][] jagged = new int[4][];→ 再逐行赋值:jagged[0] = new int[3]; jagged[1] = new int[1]; jagged[2] = new int[0]; jagged[3] = null; - 错误写法:
int[][] bad = new int[4][3];—— 这创建的是规则矩阵,所有行固定为3列,不符合“不规则”需求 - 静态初始化更直观:
int[][] safe = {{1,2}, {3}, {}, {4,5,6,7}};,各行长度由花括号内元素自动确定
遍历时必须双层防护
传统for循环是最可控的遍历方式,需嵌入两道检查:
- 外层循环只用
i 控制行范围 - 进入内层前加
if (arr[i] != null),避免对null行调用.length - 内层条件必须是
j ,绝不可写成<code>j (首行长度不代表其他行)
示例代码:
for (int i = 0; i if (arr[i] != null) {
for (int j = 0; j System.out.print(arr[i][j] + " ");
}
}
System.out.println();
}
增强for循环的适用边界
增强for(for-each)语法简洁,但隐藏索引,适合只读遍历且无需修改元素的场景:
- 安全写法:
for (int[] row : arr) { if (row != null) { for (int val : row) { ... } } } - 不适用情况:需要按行列坐标计算(如矩阵转置)、修改特定位置元素、或依赖当前索引做逻辑判断时,必须退回传统for
- 注意:增强for中
row是引用,修改row[j]仍会反映到原数组;但重新赋值row = new int[]{...}不影响原数组
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











