在平时的业务开发中,空指针是我们经常遇到的问题,
他可能会导致我们的流程无法正常进行或者一些意外情况的发生。
这就是我们需要避免空指针的原因,那我们有哪些方式去解决这个问题呢?
空指针场景
- 包装类型字段,因为自动拆箱出现空指针;
- A对象包含B对象,通过A对象获取B对象字段时,没有判断就直接去调用B对象中的方法出现空指针;
- 字符串比较,null.equal(“字符串”)出现空指针
- 远程返回的List不是空数组而是null,对其进行操作出现空指针。
线上空指针问题如何排查
日常的开发过程中,一般情况下我们都是通过查看日志来排查空指针的问题,如果日志没有做到位的情况下,我们只能通过NullPointerException抛出的位置去跟踪代码。
这就要求我们,在写代码的时候做好日志的打印
- 调用方法的入口进行入参的打印,方法返回的结果进行出参打印
如果没有提前做好日志打印,那我们可以考虑利用阿里的Java诊断工具Arthas来处理
- Arthas启动后,获取来了JVM进程
- 通过watch指令来监测方法的入参情况
思考
对于这个问题,我总结了一些我在工作中使用到的方法,
最直接的操作都是从根源上消灭出现空指针的可能性,进行先判空再操作。
下面拿商品信息作为一个例子,我们要得到他店铺的名称,你会怎么写
@Data
public class ProductVO implements Serializable {
@ApiModelProperty("skuId")
private Long skuId;
@ApiModelProperty("商品名称")
private String name;
@ApiModelProperty("品牌名")
private String brandName;
@ApiModelProperty("库存")
private Integer quantity;
@ApiModelProperty("小图列表")
private List<String> smallImgUrls;
@ApiModelProperty("店铺信息")
private ShopVO shop;
- 防御性检查,每一个变量都做一次null检查,每一次不确定一个变量是否为null时,都需要添加一个嵌套的if块,这增加了代码的层数。
// 获取店铺名称
private String getShopName1