程序员你是如何降低NPE的?

程序员,如果系统突然报了一个空指针异常,你肯定像吞了一只苍蝇一样尴尬。
那么如何在日常开发过程中降低NPE?
| 问题 | 回答 |
|---|---|
| 现状 | 返回空值会出现大量的空指针异常 |
| 目的 | 改进方法的返回值,降低出现空指针异常 |
| 实现路径 | 方法返回空集合或者空数组 |
跟我来!
背景
下面的方法看起来很常见。
private final List<Chesse> chessesInStock= ...
public List<Cheese> getCheeses(){
return cheesesInStock.isEmpty()?null:new ArrayList<>(cheesesInStock);
}
假如你去购买芝士的时候没有可用的芝士,似乎没有理由特别指出这种场景。
但是你这么做的话,客户端需要添加额外代码来处理可能返回空值的情况。示例代码如下:
List<Cheese> cheeses = shop.getCheeses();
if(cheses != null && cheeses.contains(Cheese.STILTON)){
System.out.println("jolly good");
}
每一个返回空值的方法都使用上面这种处理方式,应该替换为返回一个空集合或者空数组。
这是一种错误的趋势,因为程序员些客户端代码可能会忘记写特殊代码来处理返回的空值。
这个错误可能会持续很长时间,因为这样的方法通常会返回一个或多个对象。
不返回空集合空数组的争论
返回空值替换为返回空容器也会使得方法的实现变得复杂。
通常争论的是:返回空值比返回空集合更好是因为创建一个空的容器有性能消耗。
这个论点不对,原因有两点:
一,没有必要担心性能除非有证据显示创建一个空容器整的有损性能;
二,你可以返回一个空集合或者数组而不用创建它们。
返回空集合
下面是一个典型的代码返回一个可能的空集合,通常,这就是你所需要的。
public List<Cheese> getCheeses(){
return new ArrayList<>(cheeseInStock);
}
没有证据证明创建一个空集合会有损性能,你可以返回一个相同的不可变空集合来避免创建空集合。因为不可变对象是可以被自由共享的,下面是使用代码。
| 需求场景 | 代码 |
|---|---|
| 空List | Collections.emptyList() |
| 空Set | Collections.emptySet() |
| 空Map | Collections.emptyMap() |
但是记住,以上这些操作是只是优化,很少被调用,如果你认为你需要它,在调用前后进行性能对比,确保它真的有用。
public List<Cheese> getCheeses(){
return cheesesInStock.isEmpty()?Collections.emptyList():new ArrayList<>(cheesesInStock);
}
返回空数组
使用数组的场景跟集合是相同的,永远不要返回空值,应该返回一个长度位0的数组,常常,你应该简单的返回一个有适当长度的数组,也许长度是0。
注意我们传递一个长度为0的数组到toArray方法中来代表期望的返回类型;
public Cheese[] getCheeses(){
return cheesesInStock.toArray(new Cheese[0]);
}
如果你认为创建一个长度为0的数组会降低性能,你可以返回同一个长度为0的数组,因为所有长度为0的数组都是不可变的;
private static final Cheese[] EMPTY_ARRAY= new Cheese[0];
public Cheeses[] getCheeses(){
return cheesesInStock.toArray(EMPTY_ARRAY);
}
在优化版本中,我们传递了同一个空的数组到每一个toArray的调用,这个数组将会从getCheeses返回,无论cheesesInStock是不是空的,不要期望预分配数组可以提高性能,研究显示这是适得其反的。
return cheesesInStock.toArray(new Cheese[cheesesInStock.size()]);
小结
如果你只能记住一句话:返回空集合或者数组而不要返回空值。
返回空值会让你的API更难使用并且更容易出错,并且无性能优势;

原创不易,关注诚可贵,转发价更高!转载请注明出处,让我们互通有无,共同进步,欢迎沟通交流。
程序员你是如何降低NPE的?的更多相关文章
- [Mac A]为什么国外程序员爱用 Mac?
from http://www.vpsee.com/2009/06/why-programmers-love-mac/ Mac 在国外很受欢迎,尤其是在 设计/web开发/IT 人员圈子里.普通用户喜 ...
- 程序员必看:如何降低APP软件开发的成本?
程序员必看:如何降低APP软件开发的成本? 作为一名曾经的程序猿,一直想写一点东西给大家分享一下,今天终于动笔了,写写我们在开发的过程中怎样才能更快更好的进行开发,降低app开发成本.无论是个人开发者 ...
- 空指针异常 自动拆箱 防止 NPE,是程序员的基本修养 本手册明确防止 NPE 是调用者的责任。
空指针异常 空指针异常是指java中的异常类. 中文名 空指针异常 外文名 NullPointerException 当应用程序试图在需要对象的地方使用 null 时,抛出该异常.这种情况包括: ...
- 身边好几个技术一般的程序员都面上了,阿里P7门槛降低?
经常在网上的论坛里看到讨论程序员的级别,尤其在跳槽类的信息里可以看到对标阿里P7,百度T6,腾讯3.1等字眼,似乎大厂的级别俨然可以成为业内的通用货币,类似于高考分数一样,哪一档就对应着什么样的待遇. ...
- Code Review 程序员的寄望与哀伤
一个程序员,他写完了代码,在测试环境通过了测试,然后他把它发布到了线上生产环境,但很快就发现在生产环境上出了问题,有潜在的 bug. 事后分析,是生产环境的一些微妙差异,使得这种 bug 场景在线下测 ...
- 传播正能量——做一个快乐的程序员
引子 今天在博客园看到施瓦小辛格的文章我们搞开发的为什么会感觉到累,顿时有感而发.自己本来不擅长写文章,更不擅长写这种非技术性的文章,但是在思绪喷薄之际,还是止不住有很多话要说.针对从客观上说&quo ...
- 【腾讯Bugly经验分享】程序员的成长离不开哪些软技能?
本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/57ce8068d4d44a246f72baf2 Dev Club 是一个交流移动 ...
- Java 程序员们值得一看的好书推荐
"学习的最好途径就是看书",这是我自己学习并且小有了一定的积累之后的第一体会.个人认为看书有两点好处: 能出版出来的书一定是经过反复的思考.雕琢和审核的,因此从专业性的角度来说,一 ...
- 【转】成为Java顶尖程序员 ,看这10本书就够了
“学习的最好途径就是看书“,这是我自己学习并且小有了一定的积累之后的第一体会.个人认为看书有两点好处: 1.能出版出来的书一定是经过反复的思考.雕琢和审核的,因此从专业性的角度来说,一本好书的价值远超 ...
随机推荐
- 手把手mc开服教学(内置开服核心)
QQ交流群:1125669835 mc开服教程 首先我们需要下载一个开服核心,然后把服务器核心放在一个空文件夹里(这是我的开服核心) 然后再打开(感jio这是废话,要耐心等待......) 然后你会发 ...
- leetcode刷题记录——哈希表
1.两数之和 可以先对数组进行排序,然后使用双指针方法或者二分查找方法.这样做的时间复杂度为 O(NlogN),空间复杂度为 O(1). 用 HashMap 存储数组元素和索引的映射,在访问到 num ...
- You are using pip version 10.0.1, however version 20.2.2 is available.
在安装第三方库时,出现如下提示: You are using pip version 10.0.1, however version 20.2.2 is available.You should co ...
- COS418, Distributed System, Go Language
本博客是MIT的分布式系统课程的课后作业Cos418的GO语言实现思路.由于时间有限,目前只实现了assignment1~2. 在common.go中设置debugEnabled = true,go ...
- python元组的概念与基本操作
元组与列表类似,关于元组同样需要做如下三点: A.概念 1.元组通过英文状态下的圆括号构成“()”.其存放元素与列表一样,可以是不通的数值类型,也可以是不通的数据结构. 2.元组仍然是一种序列,所以几 ...
- 23种设计模式 - 数据结构(Composite - iterator - Chain of Responsibility)
其他设计模式 23种设计模式(C++) 每一种都有对应理解的相关代码示例 → Git原码 ⌨ 数据结构 Composite 动机(Motivation) 软件在某些情况下,客户代码过多依赖于对象容器复 ...
- 我们真的需要JWT吗?
JWT(JSON Web Token)是目前最流行的认证方案之一.博客园.各种技术公众号隔三差五就会推一篇JWT相关的文章,真的多如牛毛.但我对JWT有点困惑,今天写出来跟大家探讨探讨,不要喷哈. J ...
- Apache Pulsar 2.6.1 版本正式发布:2.6.0 功能增强版,新增 OAuth2 支持
在 Apache Pulsar 2.6.0 版本发布后的 2 个月,2020 年 8 月 21 日,Apache Pulsar 2.6.1 版本正式发布! Apache Pulsar 2.6.1 修复 ...
- CET-4 Word 计划表
a {text-decoration: none} CET-4 计划表 Sun Mon Tue Wed Thu Fri Sat 9/1 List-1 9/2 List-2 *List-1 9/3 Li ...
- iOS 报错: linker command failed with exit code 1 (use -v to see invocation) 原因
在iOS开发中,很多人会遇到这样的报错 linker command failed with exit code 1 (use -v to see invocation) 可能的原因如下: 1.引用出 ...