4 行代码写 3 个NPE非常,服了!

计算机软件开发 2024-10-2 18:01:19 49 0 来自 中国
一、前言

公司刚入职了一名中级Java开发,颠末一个星期的顺应学习,各方面表现还不错,于是分配了一个小的迭代给新人做。
需求很简朴,把从第三方拉取的数据匹配到自身公司配景设置的渠道后,聚合到一个列表中,批量入库。
然而就在匹配的逻辑中,上线后报了个NPE,这是作为一名中级开发不应犯的简朴错误,新人被我狠狠的训了,记生产事故一次。
二、事故重现

伪代码

阐明:伪代码并非真实线上代码,只是为了更方便,更形象的重现事故现场而编写的;真实的业务场景每每更加复杂,NPE的弊端隐蔽在更深处,不易code view出来,也不易测试出来;生产环境NPE是较常见的非常,渴望各人不要纠结为什么测试没测出来,关键照旧通过如许一个案例相识NPE的缘故起因和办理方案。
// 配景设置的渠道String channelNo = channelDao.getOne().getChannelNo();// 第三方拉取的数据List<ThirdData> thirdDataList = httpClientUtils.getThirdDatas(DateUtils.today());// 匹配过滤thirdDataList.stream().filter(o ->channelNo.equals(o.getChannelNo())).collect(Collectors.toList());// 批量入库thirdDataDao.saveAll(thirdDataList);分析与办理

有履历、技能踏实的同学看到这里应该或多或少能发现问题了。着实啊,这四段代码是作者经心计划的,可谓是卧龙凤雏??。
短短四行代码居然凑齐了3个NPE,我枯了/(ㄒoㄒ)/~~
我们逐行分析:
第一行分析

channelDao.getOne()假如返回为null,那么调用getChannelNo()会报NPE。
办理办法

1、使用防御性编程,提前返回(需根据详细业务场景而定)

// 假如channelNo是方法逻辑实行的必须元素,保举用此方法Channel channel = channelDao.getOne();if (channel == null) {    return;}2、使用三目运算,返回空字符串("")

// 返回兜底的空字符串String channelNo = channelDao.getOne() == null ? "" : channelDao.getOne().getChannelNo();3、使用Optional函数,返回空字符串("")

String channelNo = Optional.ofNullable(channelDao.getOne()).orElse("");第三行分析(1)

thirdDataList假如为null,那么调用stream()会报NPE。
通过下面的源码截图就能知道缘故起因:
办理办法

1、使用防御性编程,提前返回(保举)

// 保举使用聚集工具类判空if (CollectionUtils.isEmpty(thirdDataList)) {    return;}2、使用if条件语句包裹(不保举)

if (CollectionUtils.isNotEmpty(thirdDataList)) {    // 实行背面的逻辑}第三行分析(2)

channelNo假如返回为null,那么实行channelNo.equals(o.getChannelNo())会报NPE。
我们知道,按Java的规范String的equals()方法的调用,要求左边是确定值,就是为了避免调用方为null的环境。然而这里调用方和equals的入参都是变量,这种环境该怎么办呢?
1、再加一句判定:

channelNo != null && channelNo.equals(o.getChannelNo())2、着实可以用java.uti包下的Objects类的equals方法

Objects.equals(channelNo, o.getChannelNo())看源码一目了然,该方法对左边的对象做了非空判定
3、用其他开源的工具类库或者本身实现

如:org.apache.commons.lang3.StringUtilscn.hutool.core.util.StrUtil;末了

在这里l拉不拉米要保举一款IDEA的插件:
SonarLint
能动态的帮您查抄代码弊端,像NPE这种代码风险都会给于相应的提示。
SonarLint尚有一个台甫鼎鼎的服务端叫SonarQube。
您需要登录后才可以回帖 登录 | 立即注册

Powered by CangBaoKu v1.0 小黑屋藏宝库It社区( 冀ICP备14008649号 )

GMT+8, 2024-10-18 16:54, Processed in 0.152909 second(s), 32 queries.© 2003-2025 cbk Team.

快速回复 返回顶部 返回列表