如何优雅的处理NPE问题?

1.什么是NPE?

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

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

在空对象上调用实例方法

csharp 复制代码
public static void test4(){
   List list =null;
   int aaa=list.size();
}

访问空对象上的字段

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

抛出空异常

csharp 复制代码
public static void test1(){
   throw null;
}

空字符比较

csharp 复制代码
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

typescript 复制代码
public static String test6(){
   return null;
}

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

java 复制代码
public static void test2(){
   Object obj = null;
   synchronized (obj){
      //.....
   }
}

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

代码仓库

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
相关推荐
摇滚侠4 分钟前
《Spring Boot 3:高级与架构设计》第 1 章 BeanDefinitionRegistry 阅读笔记 3
spring boot·笔记·后端
君顾16 分钟前
智慧场馆解决方案小程序系统实战:从架构设计到上线指南
java·开发语言·智慧场馆
zhougl9967 分钟前
Dockerfile实战教程
java·开发语言·spring boot
新时代牛马13 分钟前
Linux 驱动调试完整篇:从printk/dev_dbg、动态调试到 debugfs/ftrace 排障
java·linux·服务器
烂蜻蜓24 分钟前
Flask入门教程(三十一):实用函数与类API——全局工具函数速查
后端·python·flask
计算机毕设定制辅导-无忧学长25 分钟前
《基于Spring Boot传承之光非遗陶瓷烧造产品交易平台的设计与实现》
java·vue.js·spring boot·后端·毕业设计
Zane199428 分钟前
内存都要回收,为什么JVM偏要把堆分成新生代和老年代
java·后端
Zane199429 分钟前
257 is 257 为什么是 True?小整数缓存背后还藏着一个更容易被忽略的机制
后端·python
Terra.K32 分钟前
后端开发阶段性总结
java·开发语言·后端
计算机学姐44 分钟前
基于SpringBoot的旅游系统的设计与实现
java·vue.js·spring boot·后端·spring·java-ee·旅游