Java不规则二维数组是“一维数组的数组”,每行长度可不同甚至为null;正确创建需外层分配行数、内层逐行分配列数;遍历时必须先判空再取长,否则易触发NullPointerException或ArrayIndexOutOfBoundsException。
Java不规则二维数组(又称“锯齿数组”)不是固定行列的矩阵,而是“一维数组的数组”,每行长度可不同,甚至某行为 null。创建和遍历时若按规则数组逻辑硬套,极易触发 NullPointerException 或 ArrayIndexOutOfBoundsException。核心原则就一条:**每次访问子数组前,必须先判空;每次取长度或下标前,必须确认该行存在且足够长。**
创建方式灵活,关键在明确“外层分配行数、内层逐行分配列数”:
int[][] jagged = { {1, 2, 3}, {4, 5}, {}, {6, 7, 8, 9} };length == 0),第四行长度为 4。new 子数组String[][] users = new String[3][];users[0] = new String[2]; // 行0:2列users[1] = new String[5]; // 行1:5列users[2] = null; // 行2:显式设为null,合法但需遍历时注意
需要索引、要修改元素、或逻辑复杂时,传统双层 for 最清晰可控:
i ,确保不越行
if (arr[i] != null),防止对 null 行调用 .length
j ,而非 <code>arr[0].length——后者在不规则数组中无意义示例代码:
立即学习“Java免费学习笔记(深入)”;
for (int i = 0; i < arr.length; i++) {<br> if (arr[i] != null) {<br> for (int j = 0; j < arr[i].length; j++) {<br> System.out.print(arr[i][j] + " ");<br> }<br> }<br> System.out.println();<br>}
适合只读、语义清晰、不依赖行列索引的场景,但对 null 更敏感:
int[] row : arr(不能写成 int x : arr)row 是引用,必须先判空:if (row != null),否则 for (int x : row) 直接报错示例代码:
立即学习“Java免费学习笔记(深入)”;
for (int[] row : arr) {<br> if (row != null) {<br> for (int x : row) {<br> System.out.print(x + " ");<br> }<br> }<br> System.out.println();<br>}
不规则数组没有统一列数,不能假设所有行都有第 c 列。安全做法分两步:
null 行,计算最大列数int maxCols = 0;<br> for (int[] row : arr) {<br> if (row != null) maxCols = Math.max(maxCols, row.length);<br> }
c 从 0 到 maxCols - 1,内层遍历每行 r,仅当 arr[r] != null && c 时才访问 <code>arr[r][c]
这样能保证每列输出“视觉对齐”,跳过缺失位置,不中断流程。