当前位置: 首页 > news >正文

null 的安全操作 vs 危险操作

1. 完全安全的操作(不会NPE)
操作类型示例代码说明
单纯赋值ListNode a = null;直接赋null值完全合法
引用传递headB = headB.next;即使headB.nextnull也安全
判等比较if(headB == null)判断是否为null不会引发NPE
方法内参数传递someMethod(headB.next);仅传递引用,不访问成员
2. 会引发NPE的危险操作
操作类型示例代码触发条件
访问成员变量int val = headB.val;headBnull
调用方法headB.toString();headBnull
链式属性访问int val = headB.next.val;headBheadB.nextnull
数组访问int[] arr = null; arr[0] = 1;arrnull

关键区分原则

  1. 仅操作引用本身(安全):

    • 赋值、传参、比较等操作只涉及引用变量本身,不访问对象内部

    • 示例:

      ListNode a = null;    // 安全
      ListNode b = a;       // 安全(b也变为null)
      if(a == null) {...}   // 安全
  2. 访问引用指向的对象(危险):

    • 任何试图通过引用访问对象成员(字段/方法)的操作

    • 示例:

      a.val;       // 危险!若a为null则NPE
      a.next.val;  // 双重危险!若a或a.next为null则NPE

链表操作中的典型场景

✅ 安全操作(无需判空)
// 移动指针(即使.next返回null)
while(current != null) {current = current.next;  // 安全!
}
❌ 危险操作(必须判空)
// 访问节点值
if(current.next.val > 0) {  // 需要先检查current.next!// ...
}// 正确写法
if(current.next != null && current.next.val > 0) {// ...
}

特殊案例解析

案例1:方法调用中的null传递
void process(ListNode node) {System.out.println(node);  // 打印null是安全的System.out.println(node.val);  // NPE!
}process(headB.next);  // 仅传递引用,不立即报错
案例2:三目运算符的短路特性
// 安全写法(等效于if-else)
ListNode next = (current != null) ? current.next : null;

记忆技巧

  1. "点号"警示原则

    • 看到 .(如 obj.xxx)就要警惕可能NPE

    • 除非 . 前面是class/static成员(如 Math.PI

  2. 操作类型速查表

    操作符/语法是否可能NPE示例
    =a = b
    ==/!=if(a == null)
    instanceofif(a instanceof X)
    .(成员访问)a.val
    [](数组访问)arr[0]

终极总结

  • 安全区:所有不涉及访问对象内部的操作(赋值、比较、传参)

  • 危险区:任何试图通过引用访问对象数据的操作(字段、方法、数组)

  • 链表编程口诀

    "移动指针不需慌,访问数据要验null"

相关文章:

  • 第7次课 栈A
  • VScode密钥(公钥,私钥)实现免密登录【很细,很全,附带一些没免密登录成功的一些解决方法】
  • [架构之美]Spring Boot集成MyBatis-Plus高效开发(十七)
  • ODA服务器计算节点本地硬盘状态异常的处理
  • [架构之美]Windows系统安装MySQL 8.0详细图文教程(十八)
  • [手写系列]Go手写db — — 完整教程
  • Linux `uptime` 指令详解与系统监控指南
  • One Data理论
  • Docker Desktop安装在其他盘
  • 材料创新与工艺升级——猎板PCB引领高频阻抗板制造革命
  • 第3.2.3节 Android动态调用链路的获取
  • vue vite 无法热更新问题
  • 北京导游资格证备考单选题题库及答案【2025年】
  • 【RT-Thread Studio】W25Q128配置
  • 【字符函数和字符串函数】
  • Cadence 高速系统设计流程及工具使用三
  • NX949NX952美光科技闪存NX961NX964
  • C++——继承
  • 华为云Git使用与GitCode操作指南
  • Windows报错:OSError: [WinError 1455] 页面文件太小,无法完成操作的问题
  • 宜昌全域高质量发展:机制创新与产业重构的双向突围
  • 为发期刊,高校学者偷贩涉密敏感数据!国安部披露间谍案细节
  • 印度外交秘书:印巴军方将于12日再次对话
  • 侧记|青年为何来沪创新创业?从这一天寻找答案
  • 越秀地产前4个月销售额约411.2亿元,达年度销售目标的34.1%
  • 上海启动万兆光网试点建设,助力“模速空间”跑出发展加速度