消灭空指针,Java 8 给我们更好的解决方案

本文探讨了Java开发中常见的空指针问题及其影响,包括包装类型、对象字段、字符串比较和远程数据操作等场景。通过分析线上空指针问题的排查方法,提出使用Java 8的Optional作为解决方案,并详细解释了Optional的用法。同时,对比了flatMap和map的区别。最后,提供了解决空指针问题的事前、事中和事后策略,强调了日志、参数校验和代码审查的重要性。
摘要由CSDN通过智能技术生成

在平时的业务开发中,空指针是我们经常遇到的问题,

他可能会导致我们的流程无法正常进行或者一些意外情况的发生。

这就是我们需要避免空指针的原因,那我们有哪些方式去解决这个问题呢?

空指针场景

  1. 包装类型字段,因为自动拆箱出现空指针;
  2. A对象包含B对象,通过A对象获取B对象字段时,没有判断就直接去调用B对象中的方法出现空指针;
  3. 字符串比较,null.equal(“字符串”)出现空指针
  4. 远程返回的List不是空数组而是null,对其进行操作出现空指针。

线上空指针问题如何排查

日常的开发过程中,一般情况下我们都是通过查看日志来排查空指针的问题,如果日志没有做到位的情况下,我们只能通过NullPointerException抛出的位置去跟踪代码。

这就要求我们,在写代码的时候做好日志的打印

  • 调用方法的入口进行入参的打印,方法返回的结果进行出参打印
    如果没有提前做好日志打印,那我们可以考虑利用阿里的Java诊断工具Arthas来处理
  1. Arthas启动后,获取来了JVM进程
  2. 通过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;
  1. 防御性检查,每一个变量都做一次null检查,每一次不确定一个变量是否为null时,都需要添加一个嵌套的if块,这增加了代码的层数。
// 获取店铺名称
private String getShopName1
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值