如果一个Java程序到处抛出NullPointerException,那么我们可能会各种吐槽代码的质量。但是我们的项目又经常会抛出空指针异常,空指针异常必然常伴Java程序员。为此我们需要了解一些它喽,NullPointerException是Java中一个常见的RuntimeException,正如阿里的Java开发手册所说,对于Java程序员来说防止NPE是一种基本素养。今天我们盘一下NullPointerException。

1 NullPointerException以及其产生的场景

Java中定义:在应用程序中尝试使用null时会抛出异常。

其中以下的情况会产生NullPointerException

  1. 调用空对象的方法,
  2. 访问或者修改对象的字段值时
  3. 获取一个空对象(数组)的长度时,
  4. 修改或者回取null数组的一个元素或者值时
  5. 抛出异常时,抛出null。

以上是针对各种具体发生异常的情况,而对于日常使用过程中,可能抛出空指针异常的情景非常多,我们常用的手册中提到了以下几种NPE产生的实际使用场景。

  • 返回类型为基本数据类型,return包装数据类型的对象时,自动拆箱有可能产生NPE。
  • 数据库的查询结果可能为null。
  • 集合里的元素即使isNotEmpty,取出的数据元素也可能为null。
  • 远程调用返回对象时,一律要求进行空指针判断,防止NPE。
  • 对于Session中获取的数据,建议进行NPE检查,避免空指针。
  • 级联调用obj.getA().getB().getC();一连串调用,易产生NPE。

自动拆箱的NPE

如下代码中,代码逻辑出现问题的话,返回就是null。

public int count(){Integer integer = null;。。。。。。return integer;
}

同理如下代码也是同样的问题,均属于自动拆装箱时的NPE问题。

public static Boolean callSuccess(){return null;};

从集合取出的值直接使用会遇到NPE.

Map<String,String> map= new HashMap<>();
map.get("test").equals("test");

2 NPE处理以及如何避免

一般程序中需要处理NPE的地方随处可见,常见的NPE预防介绍如下几种方法。

2.1 如果是链式get这种推荐使用Optional进行处理

如下代码

public class Department {private String departmentName;private Company company;...
}
public class Group {private Department department;...
}
public class Employee {private String staffName;private Group group;...
}

如果程序中需要如此调用

employee.getGroup().getDepartment().getDepartmentName();

那么每一处均可能出现NullPointerException,如果我们写成下面这样。

if (employee != null){if(employee.getGroup() != null){if(employee.getGroup().getDepartment() != null){String departmentName =    employee.getGroup().getDepartment().getDepartmentName();}}
}

if嵌套大军来袭,尔等还不下马受死。

上述if嵌套看起来的确很不美观,使用Optional可以比较容易的避免这些if判断,代码也会优雅不少。

下面不管哪一层为null返回均为Default。

String s = Optional.ofNullable(employee).map(Employee::getGroup).map(Group::getDepartment).map(Department::getDepartmentName).orElse("Default");

或者使用如下方法,如果某一层为null则返回Supplier的执行结果。

String s1 = Optional.ofNullable(employee).map(Employee::getGroup).map(Group::getDepartment).map(Department::getDepartmentName).orElseGet(() -> {return "Supplier default";});

2.2 主动进行参数检查,对方法中传入的参数进行检验

大部分的源码中使用的基础检查均会检查null

public static String testString(String str) throws Exception {if (str == null){throw new Exception("param can't be null");}return str;
}

2.3 在已知字符串上使用equals(),equalsIgnoreCase()等方法。

"knownObject".equals(unknownObject)

2.4 尽量避免方法中返回null

一些返回数组或者List的方法,如果没有值,尽量返回空集合,避免返回null。

2.5 新版本中Java输出的NullPointException详细信息

Java14 可以使用增强异常信息来查看NullPointerException的详细错误信息。Java17已经默认开启。

java -XX:+ShowCodeDetailsInExceptionMessages NPTDemo

使用Java17执行如下语句及NullPointException的输出

Map<String,String> map= new HashMap<>();
map.get("test").equals("test");
E:\Java\jdk-17.0.1\bin>java NPTDemo
Exception in thread "main" java.lang.NullPointerException: Cannot invoke "String.equals(Object)" because the return value of "java.util.Map.get(Object)" is nullat NPTDemo.main(NPTDemo.java:24)

总结

记住一句话:避免空指针异常的最好的方法就是总是检查哪些不是自己创建的对象。

Java新版本中的NullPointException的详细信息的输出对我们定位错误帮助很大,也是一个强有力的问题排查方法。

防止NullPointerException,是程序员的基本修养相关推荐

  1. 《程序员的自我修养》

    <程序员的自我修养>这本书偏底层,来来回回读了有三四遍了,每一次都有新的收获,不过很快又会忘记,所以写下了这本书从17年12月份至今的全书的笔记,留作以后自己复习. 第二章:编译和链接 源 ...

  2. 【读书笔记】程序员的自我修养总结(七)

    [读书笔记]程序员的自我修养总结(七) 标签: [编程开发] 声明:引用请注明出处http://blog.csdn.net/lg1259156776/ 说明:这是程序员的自我修养一书的读书总结,随着阅 ...

  3. 腾讯朋友力荐书籍:程序员的自我修养:链接、装载与库

    后台开发需要学习底层知识,只有底层知识掌握了,学一些中间件是信手捏来,中间件也是跑在底层的操作系统上.<<程序员的自我修养:链接.装载与库>>对学习底层知识非常有帮助,腾讯的朋 ...

  4. 程序员的自我修养,好文

    很认真的聊一聊程序员的自我修养 本文正在筹备第二版,以下是第一版主要内容 首先要谈的是,今天的话题所聊的程序员包含哪些人? 在中国,写程序,不仅仅是一种兴趣,更多的时候,还是一种普通职业和谋生工具 大 ...

  5. 【读书笔记】程序员的自我修养总结(一)

    程序员的自我修养总结(一) 声明:引用请注明出处http://blog.csdn.net/lg1259156776/ 说明:这是程序员的自我修养一书的读书总结,随着阅读的推进,逐步增加内容. 1. 关 ...

  6. 《C# 程序员的自我修养》送书活动结果公布

    截止到9月28日24:00 ,本次送书活动<C# 程序员的自我修养> 共收到150多位同学参与回复. 以下5位同学将获赠书籍一本: 夏树.Damon.水墨清华.天天.kang   以上同学 ...

  7. 很认真地聊一聊程序员的自我修养

    最近看了<浅谈程序员的英语学习>,对于文章中的观点我非常认同,英语是非常重要的,但文章站的高度还是太高,具体表述的学习方法我不是很认同,也认为不太实际,恰好之前有一篇一直没有发表的文章想重 ...

  8. Java程序员的自我修养?

    论Java程序员的自我修养,相信很多人一开始都觉得软件以后会前程似锦,可以一展才华,每一个参加Java软件开发培训班或者自学Java编程的学员都相信Java的发展前景,对于零基础学员而言自学Java软 ...

  9. 一个“程序员的自我修养”是什么?

    在<喜剧之王>中,周星驰扮演的尹天仇,一直梦想成为一名演员,而他不管是在扮演跑龙套,或者在街坊中开设演员训练班,亦或成为主角时,他对待演员的态度,始终是认真,热爱而又投入的.而那一本他随身 ...

  10. 程序员的自我修养(2)——计算机网络(转) good

    相关文章:程序员的自我修养--操作系统篇 几乎所有的计算机程序,都会牵涉到网络通信.因此,了解计算机基础网络知识,对每一个程序员来说都是异常重要的. 本文在介绍一些基础网络知识的同时,给出了一些高质量 ...

最新文章

  1. 当我们拿到数据进行建模时,如何选择更合适的算法?
  2. Spring MVC 框架搭建及详解
  3. python+requests实现接口测试 - get与post请求使用
  4. 云原生思想 — 云原生应用
  5. Linq to SQL -- Select、Distinct和Count、Sum、Min、Max、Avg
  6. css怎么设置圆角背景,CSS新特性:圆角边框多栏Gird布局背景设置
  7. 转 jquery插件--241个jquery插件—jquery插件大全
  8. android box2d小程序
  9. [Android]AndroidInject增加sqlite3数据库映射注解(ORM)
  10. jvm对象从新生代到老年代_JVM内存管理、JVM垃圾回收机制、新生代、老年代以及永久代...
  11. iframe高度自适应的实现
  12. C++虚函数及虚函数表解析
  13. Silverlight 2 Beta 1学习资源
  14. hdu 1054 Strategic Game 树形dp基础模板
  15. 用什么 软件测试无线频段,Wirelessmon无线频段与信号强度扫描工具软件使用技巧...
  16. 9个实用的,可以写进简历的数据分析项目!
  17. 新手iso系统怎么安装 新手安装iso镜像文件详细步骤
  18. 玩转5800XM资源大搜罗--软件篇
  19. [NACOS HTTP-POST] The maximum number of tolerable server reconnection errors has been reached
  20. 【css】图片的内容阴影处理

热门文章

  1. linux敏感目录文件,Windows系统和Linux系统常见敏感信息路径
  2. gif透明背景动画_常用GIF动图制作工具,抖音里面的动图都是这些工具做出来的...
  3. android和flask交互,java - 当我从Android向Flask Web服务发送参数时,如何解决“ SSL库故障”? - 堆栈内存溢出...
  4. iostat命令(转)
  5. 【VMware vSAN 6.6】5.8.自动化:vSAN硬件服务器解决方案
  6. AI看脸、测肤,左可美妆新零售,右能智慧医美
  7. 在Linux上安装Python3.6.1
  8. Faster\Slower 快慢指针的应用
  9. WPS演示中万花筒效果的实现
  10. CodeForces - 1480C Searching Local Minimum(交互+二分)