当前位置: 首页 > 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"

http://www.xdnf.cn/news/380953.html

相关文章:

  • Linux环境下基于Ncurses开发贪吃蛇小游戏
  • Java 内存模型 JMM
  • Edububtu 系统详解
  • Exploring Temporal Event Cues for Dense Video Captioning in Cyclic Co-Learning
  • 一个好用的快速学习的网站
  • python打卡day21
  • JavaScript基础-作用域概述
  • JDK10新特性
  • Apache Shiro 1.2.4 反序列化漏洞(CVE-2016-4437)
  • 二进制与十六进制数据转换:原理、实现与应用
  • DAY 21 常见的降维算法
  • 简述Web和HTTP
  • centos7.9上安装 freecad 指定安装位置
  • WinCC V7.2到V8.0与S71200/1500系列连接通讯教程以及避坑点
  • 码蹄集——向下取整(求立方根)、整理玩具、三角形斜边、完全平方数、个人所得税
  • MQTT协议介绍
  • 数据结构算法习题通关:树遍历 / 哈夫曼 / 拓扑 / 哈希 / Dijkstra 全解析
  • Python中的列表list使用详解
  • 重复的子字符串
  • 【ts】defineProps数组的类型声明
  • 人工智能100问☞第19问:什么是专家系统?
  • 自定义类型-结构体(二)
  • 基于ssm的超市库存商品管理系统(全套)
  • Vue.js框架的优缺点
  • 2025年PMP 学习六 -第5章 项目范围管理 (5.1,5.2,5.3)
  • ubunut20.04 安装运行lvi-sam
  • JavaSE核心知识点02面向对象编程02-05(方法)
  • 【比赛真题解析】混合可乐
  • 翻转数位题目解释和代码
  • C语言复习--动态内存管理