Java不规则二维数组本质是“一维数组的数组”,遍历时必须每次访问前判空、取长度前确认行存在且足够长;安全遍历需用传统for循环加null检查,增强for需谨慎,按列遍历须先求最大列宽。

Java 不规则二维数组(也叫“锯齿数组”)本质是“一维数组的数组”,每行长度可不同,甚至某行为 null。遍历时不能套用规则矩阵逻辑,否则极易触发 NullPointerException 或 ArrayIndexOutOfBoundsException。核心就一点:**每次访问子数组前先判空,每次取长度或下标前先确认该行存在且足够长。**
按行安全遍历:传统 for 循环最可靠
需要索引、要修改元素、或逻辑较复杂时,双层传统 for 是首选,控制力强、不易出错。
- 外层循环用
i < arr.length控制行范围,不越界 - 进入内层前必须加
if (arr[i] != null),防止对null行调用.length - 内层条件写成
j < arr[i].length,而不是arr[0].length—— 后者在不规则结构中毫无意义
简洁只读遍历:增强 for 循环需谨慎
适合纯遍历、不依赖行列号的场景,代码更干净,但对 null 更敏感,且无法获知当前位置。
- 外层类型必须是
int[] row : arr,不是int x : arr(编译不过) - 必须在内层循环前加
if (row != null),否则for (int x : row)直接抛空指针 - 语义清晰,但无法定位第几行第几列,不适合需索引的业务逻辑
按列遍历:先算最大宽度,再逐列检查
不规则数组没有统一列数,不能直接用 arr[0].length 当列上限。必须先扫描一遍,找出最长行的列数。
立即学习“Java免费学习笔记(深入)”;
- 第一步:遍历所有行,求最大列宽
maxCols,跳过null行 - 第二步:外层循环列号
c从0到maxCols - 1 - 第三步:内层循环每行
r,访问前判断arr[r] != null && c < arr[r].length
初始化与结构设计建议
很多问题其实源于创建阶段就埋下隐患。提前规范结构,能大幅降低遍历风险。
- 声明后别留
null行,如需“空行”,用new int[0]替代null,让.length始终可读 - 若行长度高度动态、频繁增删,优先考虑
List<List<Integer>>,避免手动管理长度和空指针 - 解析外部数据(如 JSON、表格)时,先做结构校验:每行是否为数组、长度是否非负、是否含
null元素


















