Java不规则二维数组处理难点在于逻辑控制而非语法,本质是“一维数组的数组”,每行独立、长度可异甚至为null;创建需分层分配(外层声明+内层逐行初始化),遍历时必须每次访问前判空并校验行列索引,否则易触发NullPointerException或ArrayIndexOutOfBoundsException。

Java 不规则二维数组的处理难点不在语法,而在逻辑控制——它本质是“一维数组的数组”,每行独立存在、长度可异、甚至为 null。一旦按规则矩阵思维操作,NullPointerException 和 ArrayIndexOutOfBoundsException 就会高频出现。核心不是写得多,而是每次访问前多一次判断。
创建阶段:分层分配,明确意图
不规则数组不能靠单次 new int[3][4] 一揽子搞定,必须分两步:
-
外层声明行数:如
int[][] arr = new int[5][];,只分配 5 个引用槽位,各行仍为null -
内层逐行初始化:根据业务需要分别赋值,例如
arr[0] = new int[2]; arr[1] = new int[7]; arr[2] = null; - 静态初始化更直观:
int[][] data = {{1}, {2, 3, 4}, {}, {5, 6}};,各行长度由花括号内元素自动确定
行遍历:传统 for 是安全基线
增强 for 虽简洁,但丢失索引且对 null 更敏感;传统双层 for 易控边界,适合大多数场景:
- 外层检查
i < arr.length防越行 - 进入内层前加
if (arr[i] != null),避免调用.length抛空指针 - 内层上限必须是
arr[i].length,绝不可用arr[0].length替代
列遍历:先求最大宽度,再逐列探查
不规则数组没有统一列数,想“竖着读”必须预扫描:
立即学习“Java免费学习笔记(深入)”;
- 第一遍遍历所有非空行,计算最大列宽:
maxCols = Math.max(maxCols, row.length) - 外层循环列索引
c(从0到maxCols - 1) - 内层循环每行
r,访问前严格判断:arr[r] != null && c < arr[r].length
边界与空值:三处必检点
几乎所有异常都源于这三类疏忽:
-
数组本身是否为 null:方法入参或字段使用前加
if (arr == null) -
某行是否为 null:每次取
arr[i]后、用.length或下标前必判 -
列下标是否越该行长度:
j < arr[i].length是铁律,不可省略或替换


















