商城首页欢迎来到中国正版软件门户

您的位置: 首页 > 文章列表 > 编程开发 > Java 不规则二维数组遍历中的空指针防御与逻辑校验实战

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

这样做,既能保证“视觉列对齐”的输出效果,又不会因为某一行过短而意外中断或报错。这才是正确的做法。

Ja va 不规则二维数组遍历中的空指针防御与逻辑校验实战

本文转载于:https://www.php.cn/faq/2750048.html 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。

热门关注