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

如何优雅的处理NPE问题?

1.什么是NPE?

NPE,即NullPointerException,是开发中最常见的问题之一,有必要知道如何正确地处理NPE。 对于 Java 开发者来说,null 是一个令人头疼的类型,一不小心就会发生 NPE (空指针) 问题。也是 Java 语言为人诟病的一个重要原因之一。在我们消除可恶的 NPE 问题之前我们要回顾一下 Java 中 null 的概念。

2.有6种情况下会出现NPE问题

在空对象上调用实例方法

public static void test4(){List list =null;int aaa=list.size();
}

访问空对象上的字段

public static void test5(){List<String> list =null;String aaa=list.get(0);
}

抛出空异常

public static void test1(){throw null;
}

空字符比较

public static void test3(){String str = "this is a test";boolean flag = str.equals("this is a test");System.out.println("===equals result====" + flag);str = null;flag = str.equals("this is a test");System.out.println("===equals result====" + flag);
}

直接return null

public static String test6(){return null;
}

 

对空对象进行同步或在同步块内使用null

public static void test2(){Object obj = null;synchronized (obj){//.....}
}

以上只是一些关键代码,所有代码请参见下面代码仓库

代码仓库

  • GitHub - Harries/Java-demo(npe)

Note: NPE问题一定是由逻辑错误触发的,因此使一定可以通过编码解决的,对于NPE问题,要做到早暴露,早修复,严禁使用try catch掩盖编码错误。 对于程序的调用方开发方,要么是调用方对接口的调用出现了逻辑错误,要么是开发方的代码存在逻辑错误。

  1. 如果是调用方的问题,这个问题被调用方式无法解决的,属于参数校验的检验内容,通过对参数的校验,及时发现NPE问题同时提高充分的信息提示调用方修改,例如返回错误码和错误信息。
  2. 如果是开发方代码存在问题,就要修复产生NPE问题的代码。如加入判空,使用空的集合代替null。

3.如何预防好NPE问题?

  1. 对于调用equal方法判断对象相等的情景,在已知不为空的对象上调用,如对于字符串判断相等,使用字符串调用equal而不是未知对象。
  2. 对于返回字符串的情况,返回空白字符串("")而不是null。
  3. 对于返回容器类的情况,返回空容器(Collections.EMPTY_LIST)而不是null。
  4. 使用@NotNull@Nullable提示调用者所需的参数,注解本身不会检查代码,但是可以有效提示调用者,同时在使用一些静态检查框架的时候起作用,也可以再JavaDoc文档中自动标识。
  5. 在定义变量的时候赋予合适的初始值,如("")或者空的容器(Collections.EMPTY_LIST)。
  6. 使用Optional

相关文章:

如何优雅的处理NPE问题?

1.什么是NPE&#xff1f; NPE&#xff0c;即NullPointerException&#xff0c;是开发中最常见的问题之一&#xff0c;有必要知道如何正确地处理NPE。 对于 Java 开发者来说&#xff0c;null 是一个令人头疼的类型&#xff0c;一不小心就会发生 NPE &#xff08;空指针&#xf…...

k8s 中存储之 NFS 卷

目录 1 NFS 卷的介绍 2 NFS 卷的实践操作 2.1 部署一台 NFS 共享主机 2.2 在所有k8s节点中安装nfs-utils 2.3 部署nfs卷 2.3.1 生成 pod 清单文件 2.3.2 修改 pod 清单文件增加 实现 NFS卷 挂载的 参数 2.3.3 声明签单文件并查看是否创建成功 2.3.4 在 NFS 服务器 创建默认发布…...

Redis中BitMap实现签到与统计连续签到功能

服务层代码 //签到Overridepublic Result sign() {//1.获取当前登录的用户Long userId UserHolder.getUser().getId();//获取日期LocalDateTime now LocalDateTime.now();//拼接keyString keySuffix now.format(DateTimeFormatter.ofPattern(":yyyyMM"));String …...

【Spring】“请求“ 之传递 JSON 数据

文章目录 JSON 概念JSON 语法JSON 的语法JSON 的两种结构 JSON 字符串和 Java 对象互转JSON 优点传递 JSON 对象 JSON 概念 JSON&#xff1a;JavaScript Object Notation【JavaScript 对象表示法】 JSON 就是一种数据格式&#xff0c;有自己的格式和语法&#xff0c;使用文本…...

文心一言 VS 讯飞星火 VS chatgpt (359)-- 算法导论24.3 1题

一、在图 24-2上运行Dijkstra算法&#xff0c;第一次使用结点 s s s作为源结点&#xff0c;第二次使用结点 z z z作为源结点。以类似于图 24-6 的风格&#xff0c;给出每次while循环后的 d d d值和 π π π值&#xff0c;以及集合 S S S中的所有结点。如果要写代码&#xff0c…...

Redis-预热雪崩击穿穿透

预热雪崩穿透击穿 缓存预热 缓存雪崩 有这两种原因 redis key 永不过期or过期时间错开redis 缓存集群实现高可用 主从哨兵Redis Cluster开启redis持久化aof&#xff0c;rdb&#xff0c;尽快恢复集群 多缓存结合预防雪崩&#xff1a;本地缓存 ehcache redis 缓存服务降级&…...

jvisualvm学习

系列文章目录 JavaSE基础知识、数据类型学习万年历项目代码逻辑训练习题代码逻辑训练习题方法、数组学习图书管理系统项目面向对象编程&#xff1a;封装、继承、多态学习封装继承多态习题常用类、包装类、异常处理机制学习集合学习IO流、多线程学习仓库管理系统JavaSE项目员工…...

Gazebo环境下开源UAV与USV联合仿真平台

推荐一个ROS2下基于Gazebo环境的开源UAV与USV联合仿真平台。平台是由两个开源项目共同搭建的。首先是UAV仿真平台&#xff0c;是基于PX4官方仿真平台&#xff08;https://docs.px4.io/main/en/sim_gazebo_gz&#xff09;&#xff1b;其次是USV仿真平台&#xff0c;是基于VRX仿真…...

Linux进程调度和进程切换

并行&#xff08;Parallel&#xff09; 含义&#xff1a;并行是指多个任务在同一时刻同时执行。 硬件要求&#xff1a;需要多个处理器&#xff08;如多核CPU&#xff09;或者多台计算设备来实现&#xff0c;这些执行单元能够真正地同时处理不同的任务。例如&#xff0c;一个具…...

机器学习基本上就是特征工程——《特征工程训练营》

作为机器学习流程的一部分&#xff0c;特征工程是对数据进行转化以提高机器学习性能的艺术。 当前有关机器学习的讨论主要以模型为中心。更应该关注以数据为中心的机器学习方法。 本书旨在介绍流行的特征工程技术&#xff0c;讨论何时以及如何运用这些技术的框架。我发现&…...

Android Framework AMS(01)AMS启动及相关初始化1-4

该系列文章总纲链接&#xff1a;专题总纲目录 Android Framework 总纲 本章关键点总结 & 说明&#xff1a; 说明&#xff1a;本章节主要涉及systemserver启动AMS及初始化AMS相关操作。同时由于该部分内容分析过多&#xff0c;因此拆成2个章节&#xff0c;本章节是第一章节&…...

基于基于微信小程序的社区订餐系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…...

[单master节点k8s部署]29.Istio流量管理(五)

测试istio熔断管理。 采用httpbin镜像和fortio镜像&#xff0c;其中httpbin作为服务端&#xff0c;fortio是请求端。这两个的配置yaml文件都在istio的samples/httpbin目录下&#xff0c;fortio的配置文件在samples-client目录下。 [rootmaster httpbin]# ls gateway-api ht…...

Something for 24OI

zyj老师希望我给24OI的同学们写一点东西&#xff0c;虽然感觉我也没有什么先进经验&#xff0c;还是尽力写一些主观的感受吧。 如何平衡文化课和竞赛的关系&#xff1f;不要以牺牲文化课的代价学习竞赛。首先&#xff0c;绝大多数的竞赛同学&#xff0c;或早或晚都会在退役后回…...

【React】事件机制

事件机制 react 基于浏览器的事件机制自身实现了一套事件机制&#xff0c;称为合成事件。比如&#xff1a;onclick -> onClick 获取原生事件&#xff1a;e.nativeEvent onClick 并不会将事件代理函数绑定到真实的 DOM节点上&#xff0c;而是将所有的事件绑定到结构的最外层…...

华为OD的职级与薪资

华为 OD 这几年随着招聘行情的日渐严峻&#xff0c;不少 985 高校出来的学生都开始放宽对"外包"的看法&#xff0c;其中华为 OD 以"待遇断层领先"的姿态成为不少求职者&#xff08;不得已&#xff09;的外包首选。 既然如此&#xff0c;我们就好好梳理一下…...

【HTML5】html5开篇基础(4)

1.❤️❤️前言~&#x1f973;&#x1f389;&#x1f389;&#x1f389; Hello, Hello~ 亲爱的朋友们&#x1f44b;&#x1f44b;&#xff0c;这里是E绵绵呀✍️✍️。 如果你喜欢这篇文章&#xff0c;请别吝啬你的点赞❤️❤️和收藏&#x1f4d6;&#x1f4d6;。如果你对我的…...

HTTP【网络】

文章目录 HTTPURL(Uniform Resource Lacator) HTTP协议格式HTTP的方法HTTP的状态码HTTP常见的Header HTTP 超文本传输协议&#xff0c;是一个简单的请求-响应协议&#xff0c;HTTP通常运行在TCP之上 URL(Uniform Resource Lacator) 一资源定位符&#xff0c;也就是通常所说的…...

MQ延迟消息:原理、实现与应用

在现代分布式系统中&#xff0c;消息队列&#xff08;Message Queue&#xff0c;简称MQ&#xff09;已经成为实现异步通信、解耦服务和削峰填谷的重要工具。延迟消息&#xff08;Delayed Message&#xff09;作为MQ的一种高级特性&#xff0c;允许消息在指定的延迟时间后投递到…...

计算机网络—大端序和小端序

大端序和小端序 大端序&#xff08;Big-endian&#xff09;和小端序&#xff08;Little-endian&#xff09;是指在多字节数据类型&#xff08;如整数或浮点数&#xff09;的存储和表示方式上的不同。以下是关于大端序和小端序的详细解释&#xff1a; 一、定义 大端序&#xf…...

从开发到上线:在快马平台部署一个可商用的旗博士口播智能体

最近在做一个电商直播相关的项目&#xff0c;需要快速搭建一个智能口播文案生成工具。经过一番摸索&#xff0c;我发现用InsCode(快马)平台可以非常高效地完成从开发到上线的全流程。下面分享下我的实战经验。 项目需求分析 这个旗博士口播智能体主要面向直播运营人员&#xff…...

FRCRN处理长音频文件实战:切片、批处理与结果合并

FRCRN处理长音频文件实战&#xff1a;切片、批处理与结果合并 你是不是遇到过这样的问题&#xff1f;手头有一段长达数小时的会议录音、访谈素材或者播客音频&#xff0c;背景噪音让人头疼&#xff0c;想用FRCRN这样的降噪模型处理一下&#xff0c;结果发现模型一次只能处理几…...

从Markdown到可执行规范:Tessl Framework初探与“规范即源代码”的实践思考

从Markdown到可执行规范&#xff1a;Tessl Framework初探与“规范即源代码”的实践思考 当代码行数不再是衡量开发效率的唯一标准&#xff0c;一种全新的编程范式正在悄然兴起。想象一下&#xff0c;开发者不再需要直接编写实现细节&#xff0c;而是专注于用结构化的自然语言描…...

管道应力理论(应用)

本文仅对管道应力涉及的理论知识&#xff08;偏向于应用&#xff09;进行简单介绍。管道应力&#xff1a;对管道应力校核是为了防止管壁内应力过大对管道造成破坏&#xff0c;不同的荷载引起不同类型的应力&#xff0c;在实际工程应用中&#xff0c;一般分为三种&#xff1a;一…...

ProfControl V8的介绍 阵列生成

作者&#xff1a;刘凌波链接&#xff1a;环野电子, profcontrolhttp://oa.profcontrol.cn/teaching_V8-7926f783c6.html来源&#xff1a;ProfControl阵列生成ProfControl支持基于仿射变换的阵列快速生成方式&#xff0c;ProfControl支持对各种对象进行阵列生产&#xff08;包括…...

告别低效:用快马ai一键生成can总线数据分析与统计脚本

在汽车电子和嵌入式系统开发中&#xff0c;CAN总线数据的分析是个高频需求。无论是调试车载网络问题&#xff0c;还是优化通信性能&#xff0c;都离不开对海量CAN帧数据的处理。但手动写解析脚本不仅耗时&#xff0c;还容易遗漏关键细节。最近我发现用InsCode(快马)平台的AI辅助…...

Janus-Pro-7B开发者案例:基于Gradio API构建私有AI内容中台

Janus-Pro-7B开发者案例&#xff1a;基于Gradio API构建私有AI内容中台 1. 项目概述 Janus-Pro-7B是DeepSeek发布的一款统一多模态理解与生成模型&#xff0c;它通过创新的架构设计解决了传统模型在理解与生成任务上的冲突问题。该模型支持图像问答、OCR识别、图表分析等理解…...

保姆级教程:用yangipcclient RN SDK 8.0快速给你的App加上实时对讲功能

保姆级实战&#xff1a;React Native应用集成实时对讲功能的完整指南 想象一下&#xff0c;你正在开发一款智能家居控制应用&#xff0c;用户反馈最强烈的需求是能够直接与家中的设备进行语音对讲。或者你负责的教育类App&#xff0c;小组讨论时缺少高效的实时语音沟通工具。传…...

【可分离架构物理信息神经网络:破解维度灾难的分离变量方法论】第2章 SPINN:可分离物理信息神经网络架构

目录 (Chapter 2: SPINN: Separable Physics-Informed Neural Networks) 2.1 SPINN的架构设计原理 2.1.1 按坐标轴的体网络(Body Networks)设计 2.1.2 特征融合机制与参数效率 2.2 前向模式自动微分与计算优化 2.2.1 前向自动微分在分离架构中的优势 2.2.2 超大规模配…...

食品批发厂家口碑推荐榜

在食品批发行业&#xff0c;选择一家口碑良好的厂家至关重要。优质的食品批发厂家不仅能提供高品质的产品&#xff0c;还能保障稳定的供应和良好的售后服务。今天&#xff0c;我们就来为大家推荐一些口碑出众的食品批发厂家&#xff0c;其中惠州市佳德旺食品有限公司表现尤为突…...