Java不规则二维数组出错主因是访问逻辑未适配“每行长度可变”特性:必须逐行判空防NPE,且内层循环须用row.length而非arr[0].length。

Java不规则二维数组出错,多数不是语法问题,而是访问逻辑没跟上“每行可不同”的本质。核心就一点:不能把二维数组当矩阵用,必须把每一行当作独立的一维数组来对待。
判空是第一道安全阀
不规则数组允许某行为 null,比如动态初始化时某行没分配:arr[2] = null;。一旦在遍历时跳过判空,arr[i].length 就直接抛 NullPointerException。
- 外层循环进内层前,必须写
if (arr[i] != null) - 增强 for 中,
for (int[] row : arr)后立刻接if (row != null),否则for (int x : row)会崩 - 哪怕你确认“不会为 null”,也建议保留判空——运行时数据来源不可控,防御性编程成本很低
长度不能抄作业
规则数组可用 arr[0].length 当统一列数,但不规则数组里,arr[0] 可能最短、最长,甚至为 null。拿它当所有行的长度上限,轻则漏数据,重则越界。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 内层循环条件永远用
j ,而不是 <code>j - 需要统一列宽(如列优先遍历),必须先扫一遍求最大值:
maxCols = Math.max(maxCols, row != null ? row.length : 0) - 列遍历时,对每个
(r, c)都要单独检查:arr[r] != null && c
变量复用埋雷最隐蔽
嵌套循环中混用同一变量名,比如外层用 i 控制行,内层又用 i 控制列,或在外层声明 int row = 0 后在内层反复赋值——循环结束时变量值已变,下次外层条件判断就会错。
立即学习“Java免费学习笔记(深入)”;
- 每个循环用独立变量名:外层
i,内层j;列优先时外层c,内层r - 避免在循环外声明索引变量再复用,尤其别让内层修改外层控制变量
- 用
for (int i = 0; i 形式,作用域天然隔离,比 <code>int i; for (i = ...)更安全
结构校验比异常捕获更有效
靠 try-catch 捕 ArrayIndexOutOfBoundsException 是补救,不是预防。真正健壮的做法是在处理前明确结构边界。
- 加载数据后,快速验证:是否有
null行?每行是否为int[]类型? - 业务要求“每行至少一个元素”,就加断言:
if (arr[i] == null || arr[i].length == 0) throw new IllegalArgumentException("第 " + i + " 行为空"); - 若后续频繁按列操作,可预计算并缓存
maxCols,避免每次遍历都重复扫描

















