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

NPE:记一次脑残NPE的排查过程

目录

碎碎念:

如下这行报NPE:

排查过程:

解解方案:

小结:

空指针出现的几种情况:

如何从根源避免空指针:

赋值时自动拆箱出现空指针:

1、变量赋值自动拆箱出现的空指针

2、方法传参时自动拆箱引起空指针异常

规避指南:

valueOf()和toString():

心得:

你以为这结束了???肯定不是啊!就在刚刚的截图里面,如果眼睛尖的话,应该也能看出可能存在空指针风险的地方!

使用Optional表达式!

综上

碎碎念:

你知道的,对于初学者或者不是初学者,NPE都是挺让人头疼的问题,在此记录一次NPE问题的排查过程,用来当做耻辱柱,看看是不是总会踩到一个坑里面

如下这行报NPE:

排查过程:

  • 你就得思考,为什么获取的时候会报错NPE,因为空对象不能获取东西,所以自然要想到是不是上面在对象创建的时候就是空的;
  • 然后就能看到,这个Pair是由两个值拼接而成,其中一个是查询的,所以很合理的猜想,是不是这个查询的值没查到,是null呢?

解解方案:

  • 在查询的值外面加上nullToEmpty方法;
  • 继续思考,是哪里不能为空呢?
  • 先看是不是Pair相关的不能为空;
    • 由上面的分析可以推断出,Pair的右值可能为空,因为可能确实没查到,点进去getRight,看到这注释写的是可以为空;
  • 再看是不是外面包着的Collectors.toMap不接受值为空:
  • 点进去:

小结:

虽然知道查询值时有可能因为查不到而返回空,这个时候,为了防止空指针异常就需要进行处理;

空指针出现的几种情况:

1、调用了空对象的实例方法

2、访问了空对象的属性

3、当数组是一个空对象时,取它的长度

4、方法的返回值是 null, 调用方直接去使用

如何从根源避免空指针:

1、使用之前一定要初始化,或检查是否初始化;

2、尽量避免在函数中返回 NULL, 或给出详细的注释

3、外部传值,除非有明细的说明,否则,一定要判断是否为 NULL

赋值时自动拆箱出现空指针:

1、变量赋值自动拆箱出现的空指针

Long i = null;

//变量赋值自动拆箱出现的空指针

long j = i;

Long 自动拆箱为 long 实质是调用了 longValue 方法,由于以上的 Long 类型变量值为 null,自动拆箱就会报 NPE

2、方法传参时自动拆箱引起空指针异常

public static int add(int x, int y) {

    return x + y;

}

public static void main(String[] args) {

    Integer left = null;

    Integer right = null;

    //方法传参时自动拆箱引起空指针异常

    System.out.println(add(left, right));

}

以上自动拆箱报 NPE,原因在于装箱的值为 null,调用 null 的任何 方法都会报错。

规避指南:

  • 基本数据类型优于包装器类型,优先考虑使用基本类型;
  • 对于不确定的包装器类型,一定要校验是否为 NULL;
  • 基本数据类型比包装器类型更加节省时间与空间;

valueOf()和toString():

  • 调用null对象的toString()会抛出空指针异常,使用valueOf()可以获得相同的值,传递一个 null 给 valueOf() 将会返回null。尤其是在那些包装类,像Integer、Float、Double和BigDecimal。

心得:

  • 就是代码写得少啊,不然这错误都不应该出现,所以就只能多写代码呗;

你以为这结束了???肯定不是啊!就在刚刚的截图里面,如果眼睛尖的话,应该也能看出可能存在空指针风险的地方!

同样是查询缓存,所以很可能也查不到想要的东西:

并且,写代码不要抱有侥幸心理,墨菲定律……

使用Optional表达式!

改成如下形式即可:

综上:

多写代码……多思考,有问题可以先问ChatGPT!

🤔希望一些顺利,最近感觉有点@#¥%……&*()

本卦:萃。亨,王假有庙。利见大人,亨,利贞。用大牲吉。利有攸往。   

变卦:噬嗑。亨。利用狱。   

相关文章:

NPE:记一次脑残NPE的排查过程

目录 碎碎念: 如下这行报NPE: 排查过程: 解解方案: 小结: 空指针出现的几种情况: 如何从根源避免空指针: 赋值时自动拆箱出现空指针: 1、变量赋值自动拆箱出现的空指针 2、…...

canvas样式与颜色,字体,图片,状态,形变

色彩 fillStyle color 设置图形的填充颜色。 strokeStyle color 设置图形轮廓的颜色。 备注: 一旦您设置了 strokeStyle 或者 fillStyle 的值,那么这个新值就会成为新绘制的图形的默认值。如果你要给每个图形上不同的颜色,你需要重新设置…...

重识html

html 重识html 万维网用url统一资源定位符标识分布因特网上的各种文档 各种概念 URL: 统一资源定位器 它是WWW的统一资源定位标志,就是指网络地址 在WWW上,每一信息资源都有统一的且在网上唯一的地址 网页: 由文字 图片 视频 音乐各种元素排列组…...

Redis:缓存一致性问题(缓存更新策略)

Redis缓存的一致性1. 缓存1.1 缓存的作用:1.2 缓存的成本:2. 缓存模型3. 缓存一致性问题3.1 引入3.2 解决(1) 先更新数据库,再手动删除缓存(2) 使用事务保证原子性(3) 以Redis中的TTL为兜底3.3 案例:商铺信息查询和更新(1) 查询商…...

spring之声明式事务开发

文章目录一、声明式事务之全注解式开发1、新建springConfig类2、测试程序3、测试结果二、声明式事务之XML实现方式1、配置步骤2、测试程序3、运行结果附一、声明式事务之全注解式开发 基于之前的银行转账系统,将spring.xml配置文件嘎掉,变成全注解式开发…...

2023美赛参赛经历分享

今天早上登录MCM: The Mathematical Contest in Modeling (comap.com)发现论文提交已经显示Received。虽然这几天连连有开学恶补的期末考试,但还是忙里偷闲趁着新鲜写一篇关于美赛的参赛个人感受。跟我一起打这次美赛的都是软件等专业的hxd,他们之前没有…...

Elasticsearch在Linux中的单节点部署和集群部署

目录一、Elasticsearch简介二、Linux单节点部署1、软件下载解压2、创建用户3、修改配置文件4、切换到刚刚创建的用户启动软件5、测试三、Linux集群配置1、拷贝文件2、修改配置文件3、分别修改文件所有者4、启动三个软件5、测试四、问题总结1、在elasticsearch启动时如果报错内存…...

Scala的变量声明

文章目录变量声明(一)简单说明(二)利用val声明变量1,声明方式2,案例演示(三)利用var声明变量1,声明方式2,案例演示(四)换行输入语句&a…...

面试了字节、美团、腾讯等30几家公司后,才知道软件测试面试全是这个套路......

一、Linux系统应用和环境配置: 1、Linux系统的操作命令给我说10个,一般用什么工具远程连接Linux服务器? 2、Linux中的日志存储在哪里?怎么查看日志内容? 3、Linux中top和ps命令的区别? 4、Linux命令运行…...

Anaconda环境配置

1.进入清华大学镜像网站Index of /anaconda/archive/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror,下载稳定版Anaconda3-5.2.0,如下图。2.放到整理好的文件夹中,双击安装包进行安装。3.安装过程中需要改变的默认值如下&#xff…...

Markdown编辑器使用方法

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注…...

“双碳”目标下二氧化碳地质封存技术应用前景及模型构建实践方法与讨论

我国二氧化碳地质封存技术起步较晚,目前仍没有一套相对完整的行业规范;且就该技术而言,涉及环节众多,理论相对复杂,对于行业的新入局者不太友好。因此,结合时代背景,我们首次尝试对二氧化碳地质…...

算法笔记(十二)—— Manacher算法(回文子串)

计算字符串内的最大回文子串,常用的暴力扩散在应对长度为偶数的回文时会遇到一些问题。 Manacher基础:对字符串进行填充,在字符串开头结尾以及字符间填充‘#’,以来应对偶数回文时的问题。(这是采用暴力扩再除2&#x…...

【数据结构】顺序表和链表的区别和联系(详解)

顺序表和链表的区别(详解) 文章目录顺序表和链表的区别(详解)前言一、顺序表和链表的关系二、顺序表1.优点2.缺点三、链表1.优点2.缺点四、区别表格总结前言 本文给大家介绍顺序表和链表的各自的优缺点和区别与联系,结…...

【Linux操作系统】【综合实验三 用户帐号、文件系统与系统安全管理】【更新中】

文章目录一、实验目的二、实验要求三、实验内容四、实验报告要求一、实验目的 要求掌握Linux系统用户的创建、删除与管理操作;熟悉Linux文件系统的管理模式,学会创建用户文件系统并装载和卸载文件系统;掌握超级用户的管理方式与权限&#xf…...

华为OD机试真题 用 C++ 实现 - 整数分解 | 多看题,提高通过率

最近更新的博客 华为OD机试 - 入栈出栈(C++) | 附带编码思路 【2023】 华为OD机试 - 箱子之形摆放(C++) | 附带编码思路 【2023】 华为OD机试 - 简易内存池 2(C++) | 附带编码思路 【2023】 华为OD机试 - 第 N 个排列(C++) | 附带编码思路 【2023】 华为OD机试 - 考古…...

Java集合(一)---List和set

1.Java集合有哪些?集合类型主要有3种:set(集)、list(列表)和map(映射)Map接口和Collection接口是所有集合框架的父接口:1. Collection接口的子接口包括:Set接口和List接口2. Map接口的实现类主要有&#xf…...

手撸一个Table组件(Table组件不过如此)

一、前言 手写Table组件这个文章我一直都想写,今天终于得空来写它了。小编认为Table组件是组件库里"较为复杂"的一个组件,因为它的扩展性非常强,并且它的基础样式如何去写都非常考究,那么今天我就带大家来实现一个基础…...

Python|Leetcode刷题日寄Part01

Python|Leetcode刷题日寄Part0101:两数之和02:无重复字符的最长子串03:两数相加04:反转链表05:有效的括号06:回文数07:删除有序数组中的重复项08:删除链表的倒数第N个结点09&#xf…...

微信小程序更改头像昵称

背景 前面写了一篇关于小程序头像昵称获取更改的方案&#xff0c;有很多小伙伴私信我发一个整体的逻辑思路&#xff01; 解决思路 前面的这篇文章中我们给出了页面中获取头像昵称的代码&#xff1a; <view class"headInfo" data-weui-theme"{{theme}}&qu…...

保姆级教程:用C++刷穿GPLT天梯赛L1基础题(附避坑指南)

从零开始征服GPLT天梯赛&#xff1a;C选手的L1解题全攻略 第一次接触GPLT天梯赛的L1级别题目时&#xff0c;我盯着屏幕上那道关于"零头就抹了吧"的数学题发呆了整整十分钟。作为过来人&#xff0c;我完全理解新手面对算法竞赛时那种既兴奋又忐忑的心情。本文将用最接…...

领域驱动设计实践:event-sourcing-examples中的DDD聚合模式

领域驱动设计实践&#xff1a;event-sourcing-examples中的DDD聚合模式 【免费下载链接】event-sourcing-examples Example code for my building and deploying microservices with event sourcing, CQRS and Docker presentation 项目地址: https://gitcode.com/gh_mirrors…...

FOC算法中SIMULINK常用模块解析:从坐标变换到SVPWM(实践指南)

1. FOC算法与SIMULINK模块概述 第一次接触FOC&#xff08;磁场定向控制&#xff09;算法时&#xff0c;我被那些复杂的坐标变换搞得晕头转向。直到在SIMULINK里亲手搭建了完整的控制环路&#xff0c;才真正理解每个模块的作用。FOC算法的核心思想&#xff0c;简单来说就是把三相…...

Navicat Premium Mac版试用期重置技术解析与实战指南

Navicat Premium Mac版试用期重置技术解析与实战指南 【免费下载链接】navicat_reset_mac navicat16 mac版无限重置试用期脚本 项目地址: https://gitcode.com/gh_mirrors/na/navicat_reset_mac 问题导入&#xff1a;Navicat试用期限制的技术挑战 Navicat Premium作为一…...

百川2-13B-4bits量化版温度参数研究:OpenClaw任务稳定性影响

百川2-13B-4bits量化版温度参数研究&#xff1a;OpenClaw任务稳定性影响 1. 温度参数与自动化任务的微妙关系 上周我在调试OpenClaw自动处理周报的任务时&#xff0c;遇到了一个奇怪现象&#xff1a;同样的提示词&#xff0c;有时候生成的周报结构清晰、重点突出&#xff0c;…...

(ubuntu黑屏)Z890M + U7 265KF + RTX 5070 Ti 安装 Ubuntu 22.04.5 实战记录(网卡 + 显卡驱动全解)

本文记录了在技嘉 Z890M Intel Core Ultra 7 265KF RTX 5070 Ti 新平台上&#xff0c;成功安装 Ubuntu 22.04.5 并解决网卡、显卡驱动问题的完整过程&#xff0c;适合同类配置参考。一、硬件环境组件型号主板技嘉 Z890M 小雕&#xff08;带 WiFi&#xff09;CPUIntel Core Ul…...

QuantsPlaybook因子测试框架深度剖析:量化因子评估的创新方法论

QuantsPlaybook因子测试框架深度剖析&#xff1a;量化因子评估的创新方法论 【免费下载链接】QuantsPlaybook 项目地址: https://gitcode.com/GitHub_Trending/qu/QuantsPlaybook 副标题&#xff1a;如何构建稳定有效的选股策略&#xff1f;从原理到实战的完整指南 量…...

VINS-Mono跑EUROC数据集后,如何用evo工具包进行轨迹精度评估与可视化(附完整命令)

VINS-Mono轨迹精度评估实战&#xff1a;从EUROC数据集到evo工具包全流程解析 在完成VINS-Mono算法在EUROC数据集上的运行后&#xff0c;如何科学评估其轨迹精度成为算法优化和论文撰写的关键环节。本文将深入讲解使用evo工具包进行定量分析的完整流程&#xff0c;涵盖指标计算、…...

Unity3D集成百度语音识别与唤醒功能实战指南(Android平台)

1. 为什么选择百度语音SDK&#xff1f; 在Unity3D项目中实现语音交互功能时&#xff0c;百度语音识别与唤醒SDK是我测试过最稳定的解决方案之一。特别是在Android平台上&#xff0c;它的离线唤醒功能响应速度能控制在800毫秒内&#xff0c;识别准确率在安静环境下能达到95%以上…...

ESP32S3端口死活不识别?别急着换线,先试试这个USB驱动修复大法

ESP32S3端口识别难题&#xff1a;从底层原理到实战修复的全方位指南 当你满怀期待地将ESP32S3开发板连接到电脑&#xff0c;准备开始物联网项目的开发时&#xff0c;却发现设备管理器里怎么也找不到对应的COM端口——这种挫败感我深有体会。作为一款功能强大的Wi-Fi/蓝牙双模芯…...