20k招的工程师刚加入团队,4行代码写3个NPE异常,服了!

简介: 20k招的工程师刚加入团队,4行代码写3个NPE异常,服了!


来源:juejin.cn/post/

7031445206152577061

image.png


一、前言

Hello 大家好,今天带来一个真实案例,让大家更深刻的理解空指针异常。

公司刚入职了一名中级Java开发,经过一个星期的适应学习,各方面表现还不错,于是分配了一个小的迭代给新人做。

需求很简单,把从第三方拉取的数据匹配到自身公司后台设置的渠道后,聚合到一个列表中,批量入库。

然而就在匹配的逻辑中,上线后报了个NPE,这是作为一名中级开发不应犯的简单错误,新人被我狠狠的训了,记生产事故一次。

基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

二、事故重现

伪代码

说明:伪代码并非真实线上代码,只是为了更方便,更形象的重现事故现场而编写的;真实的业务场景往往更加复杂,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。

通过下面的源码截图就能知道原因:

image.png

image.png

解决办法

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())

看源码一目了然,该方法对左边的对象做了非空判断

image.png

3、用其他开源的工具类库或者自己实现
如:
org.apache.commons.lang3.StringUtils
cn.hutool.core.util.StrUtil;


基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

最后

在这里要推荐一款IDEA的插件:

SonarLint

image.png

能动态的帮您检查代码漏洞,像NPE这种代码风险都会给于相应的提示。

SonarLint还有一个大名鼎鼎的服务端叫SonarQube。

相关文章
|
2月前
|
人工智能 JavaScript API
DeepSeek Harness 实测:大模型为什么还需要 Harness?
本文深度评测DeepSeek Harness——国产AI编程Agent新工具。作者实测三大任务(幸存者游戏、俄罗斯方块、梁子滑动变阻器),对比GPT/Codex,分析完成时间、Token消耗、费用与效果,并详解其“模型为脑、Harness为手脚”的执行闭环机制及蓬勃发展的插件生态(文件引用、多模态、数据库等)。
554 7
DeepSeek Harness 实测:大模型为什么还需要 Harness?
|
8月前
|
JSON 监控 安全
多Agent上生产的第一课:日志、轨迹、回放与责任归因
多Agent系统排查难?作者亲历生产事故后,提出五层可观测性体系:结构化日志(含参数/结果)、任务轨迹(还原数据流)、可解释回放、责任归因(结合推理链)、状态审计。最小方案仅需3天落地,让问题定位从“两小时盲猜”缩至“五分钟定位”。
829 1
|
2月前
|
人工智能 前端开发 API
DeepSeek+WorkBuddy,下一代Office工作台来了!
微软还没做到的事,腾讯WorkBuddy先做到了。Office彻底进入Agent时代!
445 0
|
5月前
|
弹性计算 人工智能 测试技术
2026年阿里云便宜云服务器推荐与选购指南
2026年阿里云推出史上最强优惠:打破新老用户壁垒,实现“新老同价、续费同价”。99元/年e实例、199元/年u1实例长期稳定;新用户可抢38元/年轻量服务器;企业享百万迁云补贴与GPU 4折。省钱避坑指南,助你轻松上云!
870 4
|
10月前
|
XML 缓存 Java
多平台商品详情 API 统一封装:适配层设计与异构数据映射
电商企业对接多平台(如淘宝、京东、拼多多、抖音电商,或自有小程序 / APP/H5)时,各平台商品详情 API 存在接口协议异构、字段命名不一、数据格式差异、业务规则不同等问题,直接调用会导致代码耦合度高、维护成本激增。本文聚焦「适配层设计」和「异构数据映射」两大核心,拆解多平台商品详情 API 统一封装的落地方案,实现「一套上层接口、多平台底层适配」的目标。
|
7月前
|
存储 自然语言处理 Python
Python入门教程(新手必看)(终)
教程来源 https://app-acda5zfcddz5.appmiaoda.com 从控制流(if/while/for)、四大数据结构(列表、元组、字典、集合),到函数定义与作用域、文件读写、异常处理、模块导入,最后通过学生成绩管理系统实战整合所学,强调动手实践,助力初学者扎实入门。
|
8月前
|
人工智能 Serverless 对象存储
从零构建高可用 Serverless 应用:基于阿里云 FC + LynxCode 的企业级实战
本文实战演示如何利用阿里云函数计算(FC)结合AI工具LynxCode(原Lynx AI),从零构建高可用Serverless图像处理应用,解析架构优势与成本效益。
|
9月前
|
存储 数据挖掘 关系型数据库
阿里云服务器通用型g9i实例测评:性能、适用场景,收费标准与最新活动价格参考
阿里云通用型g9i实例作为第九代云服务器代表,搭载英特尔至强6处理器(P-Core)与CIPU架构,实现计算、存储、网络性能全面突破。其1:4的处理器与内存配比,适配高网络包收发、游戏服务器、中小型数据库等多场景需求。2026年初促销活动中,提供年付6.4折优惠,结合学生无门槛券、企业迁云补贴等政策,成本进一步降低。从2核8G到192核768G的丰富规格,支持按量/包年包月模式,助力企业精准匹配业务需求,成为通用计算的理想之选。
1386 1
|
10月前
|
缓存 API UED
Vue3性能调优实战:5个关键技巧让你的应用飞起来!
Vue3性能调优实战分享,涵盖shallowRef、v-memo、异步组件、markRaw、watchEffect等关键优化技巧。
Vue3性能调优实战:5个关键技巧让你的应用飞起来!
|
11月前
|
机器学习/深度学习 弹性计算 编解码
阿里云服务器ECS计算型c9i实例收费标准价格表:一年、1小时和1个月费用清单
阿里云ECS计算型c9i实例基于全新CIPU架构,搭载Intel Xeon Granite Rapids处理器,主频3.2GHz,性能稳定,适用于机器学习、视频编码、高性能计算等场景。支持按量付费(小时计费)和包年包月多种模式,提供从ecs.c9i.large到ecs.c9i.48xlarge共12种配置,vCPU从2核至192核,内存4GiB至384GiB,网络带宽最高64Gbps,云盘IOPS达80万。价格灵活,一年付、三年付享大幅折扣,适合不同业务需求。
992 13

热门文章

最新文章