空指针和越界异常均源于未校验子数组非空就访问其length或元素;防御需建立“先判行非空再取长,先保列范围再取值”的两层校验链:i∈[0,arr.length)且arr[i]≠null,j∈[0,arr[i].length)。

Java 不规则二维数组遍历中,空指针异常(NullPointerException)和越界异常(ArrayIndexOutOfBoundsException)几乎都源于同一个动作:在未确认子数组存在前,就直接访问它的 .length 或下标元素。防御的核心不是“多加几行判断”,而是建立清晰的访问链条——先判行非空,再取长;先保列在范围内,再取值。
遍历前必须做的两层校验
任何对 arr[i][j] 的访问,本质是两次引用操作:arr[i] → arr[i][j]。中间任意一环为 null 都会崩溃。
-
第一层校验(行级):检查
i是否在[0, arr.length)范围内,且arr[i] != null -
第二层校验(列级):检查
j是否在[0, arr[i].length)范围内(注意:此时arr[i]已确定非空)
漏掉任一环,比如只校验 i 却忽略 arr[i] == null,或误用 arr[0].length 代替 arr[i].length,都会埋下隐患。
传统 for 循环的安全写法
需要索引、需修改元素、或逻辑较复杂时,传统双层 for 是最可控的选择。关键在于把校验嵌入循环结构本身:
立即学习“Java免费学习笔记(深入)”;
- 外层循环条件只控行数:
i - 每轮进入内层前,用
if (arr[i] != null)拦截空行 - 内层循环上限严格取当前行长度:
j ,而非固定值或首行长度
示例:
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
for (int i = 0; i < arr.length; i++) {
if (arr[i] != null) {
for (int j = 0; j < arr[i].length; j++) {
System.out.print(arr[i][j] + " ");
}
}
System.out.println();
}
增强 for 循环的注意事项
代码更简洁,但失去索引信息,且对 null 更敏感。使用时必须显式处理空行:
- 外层类型声明必须是
int[] row : arr(不能是int x : arr) - 内层循环前必须加
if (row != null),否则for (int x : row)会直接抛 NPE - 适合纯读取场景,无法知道当前是第几行第几列
示例:
for (int[] row : arr) {
if (row != null) {
for (int x : row) {
System.out.print(x + " ");
}
}
System.out.println();
}
按列遍历的特殊处理
不规则数组没有统一列数,按列遍历需分两步:
-
预扫描求最大列宽:遍历所有非空行,记录最大
row.length -
列主循环 + 行内校验:外层循环列号
c,内层循环每行r,访问前检查arr[r] != null && c < arr[r].length
这样能安全输出“视觉列对齐”的结果,不会因某行过短而中断或越界。

















