Java 不规则二维数组遍历中的空指针防御与逻辑校验实战
作者:小宇宙叶知秋
时间:2026-07-04
浏览:0
处理不规则二维数组时,空指针与越界异常源于未确认子数组非空便直接访问。防御关键在于先判行非空再取长,先保列范围再取值。传统循环可嵌入校验,增强循环需显式判空,按列遍历则需先确定最大列宽。
空指针和越界异常,几乎是每个Ja va开发者都会遇到的噩梦。尤其是在处理不规则二维数组时,稍不留神,代码就崩给你看。说白了,这类异常的根本原因就一条:在未确认子数组非空之前,就直接去访问它的.length或下标元素。
防御的关键不是堆砌判断语句,而是构建一条清晰的访问链条:先判行非空再取长,先保列范围再取值。就这么简单,但很多人就是忘。
遍历前,心里要过这两层坎
任何一次arr[i][j]的访问,本质上都是两次引用操作:先找arr[i],再找arr[i][j]。只要中间某一环是null,程序当场就死给你看。
- 第一层,行级校验:确保
i在[0, arr.length)范围内,并且arr[i]本身不是null。 - 第二层,列级校验:在确认当前行非空后,再检查
j是否在[0, arr[i].length)范围内。
这两层,少一个都不行。比如很多人只校验了i,却忘了arr[i]本身可能就是null;或者图省事,直接用arr[0].length代替arr[i].length,这都是在给自己埋坑。
传统for循环:稳,且可控
当需要用到索引、修改元素值,或者逻辑本身比较复杂时,传统的双层for循环仍然是首选。它的优势在于,你可以把校验逻辑直接嵌入到循环结构中:
- 外层循环只控制行数:
i < arr.length。 - 进入内层前,先用
if (arr[i] != null)把空行拦截掉。 - 内层循环的上限必须是当前行的长度:
j < arr[i].length,千万别写成固定值,或者偷懒用第一行的长度。
看看这个例子:
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循环:简洁,但更敏感
for-each循环写起来确实简洁,但代价是失去了索引信息,而且对null行更敏感。使用时,必须显式处理空行,否则代码会直接抛NPE:
- 外层声明的类型必须是
int[] row,写成int x的话,后面没法用。 - 内层循环开始前,必须加一句
if (row != null),这是救命用的。 - 适合纯读取场景,因为没办法知道当前是第几行第几列。
示例代码长这样:
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。
这样做,既能保证“视觉列对齐”的输出效果,又不会因为某一行过短而意外中断或报错。这才是正确的做法。

作者最新文章
极度公式
2026-09-16 17:43
索尼WH-1000XM4C发布:复刻经典折叠设计并升级现代接口
2026-09-08 19:10
PDF转TXT操作步骤与转换后内容核对指南
2026-09-04 18:03
Photoshop安装失败或启动异常:系统要求、安装流程与故障排查指南
2026-09-03 06:04
PDF文件体积过大如何压缩及压缩后清晰度检查方法
2026-09-02 19:30
上一篇:
Java 中静态内部类加载顺序是怎样的
热门文章
更多
精品专题
更多
Mac软件
更多
WINDOWS
更多


































