NullPointerException 处理规范 --- 记一次空指针引起的小组风波

本文主要是介绍NullPointerException 处理规范 --- 记一次空指针引起的小组风波,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

All input is evil。

        一切的入参都是邪恶的,作为编码人员都无法掌握。如果不针对这些参数做校验,我们的程序就会出现这样或那样的问题。NullPointerException作为一个老生常谈的话题,我这里又把它拎出来了。
        本次讨论这个话题源于司内一个案例的NullPointerException的复盘。下面我贴一下相关代码。因为涉及到公司的业务源码,会有一定的隐饰。
        

/*** 出现NullPointerException位置已经标出,大家自行阅读* InnerException 是一个自定义异常* @param ids* @return* @throws InnerException*/public Map<String, List<User>> getAdCards(List<String> ids) throws InnerException {List<Long> userIds = decodeLiveIds(ids);List<User> Users = liveBiz.getUsers(getUserIdOrNull(), userIds);return users;}private List<Long> decodeLiveIds(List<String> userIds) throws InnerException {List<Long> ids = new ArrayList<>();for (String userId : userIds) { //此处出现NullPointerExceptionids.add(UserUtil.decode(userId));}return ids;}

        其实一开始我是这样想的,我觉得“所有的公共方法一定要可接受所有可能的参数。因为我们不知道调用公共方法的developer对公共方法的入参全部情景考虑周全,并对入参做全场景校验”

       但是我的同事一开始是这样想的“单个方法只做一件事,符合单一职责原则。把校验规则放到上层,本抽取方法只做解密操作”

        由此看来,我们针对此问题有一个共同点 - “此处参数要做校验

        我们不同的观点是 - “做校验的位置

 针对这种情况,大家一般是怎么处理的呢?大家可以自行考虑下再向下阅读。

经过复盘总结,结合业内规范和笔者公司的规范,最终给出如下建议供大家遵循:

  • 对外提供的开放接口,不管是RPC/API/HTTP接口,必须做参数校验;

  •  极有可能被循环调用的方法,但在方法说明里必须注明外部参数检查,不需要做方法校验;

  • 被声明为private只会被自己代码所调用的方法。如果能够确定调用方法的代码传入参数已经做过检查或者肯定不会有问题,此时可以不校验参数。

        

针对笔者给到的建议,大家可在评论区留言自己的观点,大家一起探讨!

附:

       复盘后,司内是在调用方做的参数校验,并在被调用方的方法描述中添加可用入参描述!

这篇关于NullPointerException 处理规范 --- 记一次空指针引起的小组风波的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1049935

相关文章

无人叉车3d激光slam多房间建图定位异常处理方案-墙体画线地图切分方案

墙体画线地图切分方案 针对问题:墙体两侧特征混淆误匹配,导致建图和定位偏差,表现为过门跳变、外月台走歪等 ·解决思路:预期的根治方案IGICP需要较长时间完成上线,先使用切分地图的工程化方案,即墙体两侧切分为不同地图,在某一侧只使用该侧地图进行定位 方案思路 切分原理:切分地图基于关键帧位置,而非点云。 理论基础:光照是直线的,一帧点云必定只能照射到墙的一侧,无法同时照到两侧实践考虑:关

MySQL高性能优化规范

前言:      笔者最近上班途中突然想丰富下自己的数据库优化技能。于是在查阅了多篇文章后,总结出了这篇! 数据库命令规范 所有数据库对象名称必须使用小写字母并用下划线分割 所有数据库对象名称禁止使用mysql保留关键字(如果表名中包含关键字查询时,需要将其用单引号括起来) 数据库对象的命名要能做到见名识意,并且最后不要超过32个字符 临时库表必须以tmp_为前缀并以日期为后缀,备份

【生成模型系列(初级)】嵌入(Embedding)方程——自然语言处理的数学灵魂【通俗理解】

【通俗理解】嵌入(Embedding)方程——自然语言处理的数学灵魂 关键词提炼 #嵌入方程 #自然语言处理 #词向量 #机器学习 #神经网络 #向量空间模型 #Siri #Google翻译 #AlexNet 第一节:嵌入方程的类比与核心概念【尽可能通俗】 嵌入方程可以被看作是自然语言处理中的“翻译机”,它将文本中的单词或短语转换成计算机能够理解的数学形式,即向量。 正如翻译机将一种语言

Thymeleaf:生成静态文件及异常处理java.lang.NoClassDefFoundError: ognl/PropertyAccessor

我们需要引入包: <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency><dependency><groupId>org.springframework</groupId><artifactId>sp

【C++学习笔记 20】C++中的智能指针

智能指针的功能 在上一篇笔记提到了在栈和堆上创建变量的区别,使用new关键字创建变量时,需要搭配delete关键字销毁变量。而智能指针的作用就是调用new分配内存时,不必自己去调用delete,甚至不用调用new。 智能指针实际上就是对原始指针的包装。 unique_ptr 最简单的智能指针,是一种作用域指针,意思是当指针超出该作用域时,会自动调用delete。它名为unique的原因是这个

C语言指针入门 《C语言非常道》

C语言指针入门 《C语言非常道》 作为一个程序员,我接触 C 语言有十年了。有的朋友让我推荐 C 语言的参考书,我不敢乱推荐,尤其是国内作者写的书,往往七拼八凑,漏洞百出。 但是,李忠老师的《C语言非常道》值得一读。对了,李老师有个官网,网址是: 李忠老师官网 最棒的是,有配套的教学视频,可以试看。 试看点这里 接下来言归正传,讲解指针。以下内容很多都参考了李忠老师的《C语言非

jenkins 插件执行shell命令时,提示“Command not found”处理方法

首先提示找不到“Command not found,可能我们第一反应是查看目标机器是否已支持该命令,不过如果相信能找到这里来的朋友估计遇到的跟我一样,其实目标机器是没有问题的通过一些远程工具执行shell命令是可以执行。奇怪的就是通过jenkinsSSH插件无法执行,经一番折腾各种搜索发现是jenkins没有加载/etc/profile导致。 【解决办法】: 需要在jenkins调用shell脚

JavaEE7 Servlet 3.1(JSR 340)规范中文版

http://www.iteye.com/news/27727-jinnianshilongnian     Jave EE 7中的部分规范已正式获得批准通过,其中包括JSR340 Java Servlet 3.1规范,去年翻译了该规范,在此分享出来,希望对某些朋友有所帮助,不足之处请指正。   点击直接下载    在线版目录   Servlet3.1规范翻译

明明的随机数处理问题分析与解决方案

明明的随机数处理问题分析与解决方案 引言问题描述解决方案数据结构设计具体步骤伪代码C语言实现详细解释读取输入去重操作排序操作输出结果复杂度分析 引言 明明生成了N个1到500之间的随机整数,我们需要对这些整数进行处理,删去重复的数字,然后进行排序并输出结果。本文将详细讲解如何通过算法、数据结构以及C语言来解决这个问题。我们将会使用数组和哈希表来实现去重操作,再利用排序算法对结果

8. 自然语言处理中的深度学习:从词向量到BERT

引言 深度学习在自然语言处理(NLP)领域的应用极大地推动了语言理解和生成技术的发展。通过从词向量到预训练模型(如BERT)的演进,NLP技术在机器翻译、情感分析、问答系统等任务中取得了显著成果。本篇博文将探讨深度学习在NLP中的核心技术,包括词向量、序列模型(如RNN、LSTM),以及BERT等预训练模型的崛起及其实际应用。 1. 词向量的生成与应用 词向量(Word Embedding)