花式踩坑Java空指针和避坑的正确姿势

简介: 花式踩坑Java空指针和避坑的正确姿势

一、背景

程序员写代码经常被调侃为 “写BUG”。


然而开发中遇到的其中一个主要 BUG 就是 空指针造成的。



很多人并不会认为预发空指针有多难,甚至有些人会认为自己如果写代码肯定会注意到。


最大的问题是,我们写代码时很多空指针的情况并不是直接发生的,而是被“传递”过来的,导致没有留意。


下面介绍几种工作中可能不经意中写出的,花式踩坑空指针异常的姿势。


二、踩坑姿势

2.1 自动拆箱空指针异常

如调用类似下面这种格式的二方服务接口,

image.png


如果不进行判空而直接使用,则很容易碰到空指针:

image.png

正确的使用姿势应该是:

image.png


2.2 RPC接口返回null

二方服务的批量查询接口如果数据量大容易超时,因此我们可以分批查询,参加下面代码:



image.png

看似没啥问题,先将参数集合拆分成 多个小集合,然后调用传入的接口查询。


问题是,如果其中一批调用返回了 null 会怎样?


很可能发生空指针异常。

image.png



因此在合并前应该将结果为 null 的过滤掉。



三、预防

3.1 手册

《阿里巴巴 Java编程规范》 给出了空指针的一些常见场景:


返回类型为基本数据类型,return 包装数据类型的对象时,自动拆箱有可能产生 NPE

数据库查询结果可能为null

集合元素即使 isNotEmpty,取出数据元素可能为null

远程调用返回对象时,一律要求进行空指针判断,防止 NPE


对于 Session 中获取的数据,建议进行 NPE 检查,避免空指针


级联调用 obj.getA().getB().getC();一连串调用,易产生 NPE


3.2 源码

Java 空指针异常的源码注释提供了 产生空指针的主要原因:


 image.png



调用 null 对象的实例方法

访问或者修改 null 对象的属性

获取值为null 的数组长度

访问或修改值为 null 的二维数组的列

把 null 当做 Throwable 对象抛出

官方源码列举的几种情况,更全面,更有参考价值。



四、预发空指针

4.1 作为接口提供方或者编写者

编写接口时


如果返回值为集合类型,如果没值尽量返回空集合。

可以返回Optional

4.2 作为接口的使用方

使用 commons-lang3 或者 guava的 字符串、对象、集合工具类判空

使用@Nonnull 注解等避免必传字段前端传null


五、总结

写代码时不要想当然,很多时候大意失荆州。


要了解常见的造成空指针的场景,开发时极力避免。


多看源码注释,会有更多发现。


相关文章
|
6月前
|
存储 Oracle Java
Java11--ZGC--权衡--ZGC--GC术语--着色指针--多重映射--读屏障标记--重定位
Java11--ZGC--权衡--ZGC--GC术语--着色指针--多重映射--读屏障标记--重定位
132 0
java.lang.NullPointerExceptionMybatisPlus出现,测试,java.lang.NullPointe,空指针异常,public方法少写了一个字段,没加注解
java.lang.NullPointerExceptionMybatisPlus出现,测试,java.lang.NullPointe,空指针异常,public方法少写了一个字段,没加注解
|
5月前
|
Java
2022蓝桥杯大赛软件类国赛Java大学B组 左移右移 空间换时间+双指针
2022蓝桥杯大赛软件类国赛Java大学B组 左移右移 空间换时间+双指针
44 3
|
4月前
|
缓存 Java 数据库连接
Java演进问题之指针的间接获取现在对性能的影响变得更大如何解决
Java演进问题之指针的间接获取现在对性能的影响变得更大如何解决
|
6月前
|
存储 Java 开发者
探索Java开发中触发空指针异常的场景
作为一名后端开发者在Java编程的世界中,想必大家对空指针并不陌生,空指针异常是一种常见而又令人头疼的问题,它可能会在我们最不经意的时候突然出现,给我们的代码带来困扰,甚至导致系统的不稳定性,而且最可怕的是有时候不能及时定位到它的具体位置。针对这个问题,我们需要深入了解触发空指针异常的代码场景,并寻找有效的方法来识别和处理这些异常情况,而且我觉得空指针异常是每个Java开发者都可能面临的挑战,但只要我们深入了解它的触发场景,并采取适当的预防和处理措施,我们就能够更好地应对这个问题。那么本文就来分享一下实际开发中一些常见的触发空指针异常的代码场景,并分享如何有效地识别和处理这些异常情况。
101 1
探索Java开发中触发空指针异常的场景
|
6月前
|
安全 Java
Java为什么不让用指针?
总之,Java的设计目标之一是提供一个安全、稳定和易于开发的平台,通过禁止直接使用指针来实现这些目标。虽然指针可以提供更大的灵活性,但也带来了许多潜在的问题和安全风险。因此,Java采用了更高级的内存管理和安全性机制,以减少这些问题的发生。
65 1
|
6月前
|
Java
Java String 避免空指针的方法
Java String 避免空指针的方法
53 0
|
6月前
|
Rust 索引
Rust 编程小技巧摘选(6)
Rust 编程小技巧摘选(6)
82 1
Rust 编程小技巧摘选(6)
|
6月前
|
安全 IDE Java
终结空指针异常:Java开发者的生存指南
终结空指针异常:Java开发者的生存指南
164 1
|
6月前
|
安全 IDE Java
【2024java面试题无需C币下载】终结空指针异常:Java开发者的生存指南
【2024java面试题无需C币下载】终结空指针异常:Java开发者的生存指南
83 1