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

相关文章

Python+FFmpeg实现视频自动化处理的完整指南

《Python+FFmpeg实现视频自动化处理的完整指南》本文总结了一套在Python中使用subprocess.run调用FFmpeg进行视频自动化处理的解决方案,涵盖了跨平台硬件加速、中间素材处理... 目录一、 跨平台硬件加速:统一接口设计1. 核心映射逻辑2. python 实现代码二、 中间素材处

Go异常处理、泛型和文件操作实例代码

《Go异常处理、泛型和文件操作实例代码》Go语言的异常处理机制与传统的面向对象语言(如Java、C#)所使用的try-catch结构有所不同,它采用了自己独特的设计理念和方法,:本文主要介绍Go异... 目录一:异常处理常见的异常处理向上抛中断程序恢复程序二:泛型泛型函数泛型结构体泛型切片泛型 map三:文

SpringSecurity中的跨域问题处理方案

《SpringSecurity中的跨域问题处理方案》本文介绍了跨域资源共享(CORS)技术在JavaEE开发中的应用,详细讲解了CORS的工作原理,包括简单请求和非简单请求的处理方式,本文结合实例代码... 目录1.什么是CORS2.简单请求3.非简单请求4.Spring跨域解决方案4.1.@CrossOr

requests处理token鉴权接口和jsonpath使用方式

《requests处理token鉴权接口和jsonpath使用方式》文章介绍了如何使用requests库进行token鉴权接口的处理,包括登录提取token并保存,还详述了如何使用jsonpath表达... 目录requests处理token鉴权接口和jsonpath使用json数据提取工具总结reques

C# 空值处理运算符??、?. 及其它常用符号

《C#空值处理运算符??、?.及其它常用符号》本文主要介绍了C#空值处理运算符??、?.及其它常用符号,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录一、核心运算符:直接解决空值问题1.??空合并运算符2.?.空条件运算符二、辅助运算符:扩展空值处理

浅析Python中如何处理Socket超时

《浅析Python中如何处理Socket超时》在网络编程中,Socket是实现网络通信的基础,本文将深入探讨Python中如何处理Socket超时,并提供完整的代码示例和最佳实践,希望对大家有所帮助... 目录开篇引言核心要点逐一深入讲解每个要点1. 设置Socket超时2. 处理超时异常3. 使用sele

SpringMVC配置、映射与参数处理​入门案例详解

《SpringMVC配置、映射与参数处理​入门案例详解》文章介绍了SpringMVC框架的基本概念和使用方法,包括如何配置和编写Controller、设置请求映射规则、使用RestFul风格、获取请求... 目录1.SpringMVC概述2.入门案例①导入相关依赖②配置web.XML③配置SpringMVC

解决docker目录内存不足扩容处理方案

《解决docker目录内存不足扩容处理方案》文章介绍了Docker存储目录迁移方法:因系统盘空间不足,需将Docker数据迁移到更大磁盘(如/home/docker),通过修改daemon.json配... 目录1、查看服务器所有磁盘的使用情况2、查看docker镜像和容器存储目录的空间大小3、停止dock

5 种使用Python自动化处理PDF的实用方法介绍

《5种使用Python自动化处理PDF的实用方法介绍》自动化处理PDF文件已成为减少重复工作、提升工作效率的重要手段,本文将介绍五种实用方法,从内置工具到专业库,帮助你在Python中实现PDF任务... 目录使用内置库(os、subprocess)调用外部工具使用 PyPDF2 进行基本 PDF 操作使用

分析 Java Stream 的 peek使用实践与副作用处理方案

《分析JavaStream的peek使用实践与副作用处理方案》StreamAPI的peek操作是中间操作,用于观察元素但不终止流,其副作用风险包括线程安全、顺序混乱及性能问题,合理使用场景有限... 目录一、peek 操作的本质:有状态的中间操作二、副作用的定义与风险场景1. 并行流下的线程安全问题2. 顺