程序员,如果系统突然报了一个空指针异常,你肯定像吞了一只苍蝇一样尴尬。

那么如何在日常开发过程中降低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的?的更多相关文章

  1. [Mac A]为什么国外程序员爱用 Mac?

    from http://www.vpsee.com/2009/06/why-programmers-love-mac/ Mac 在国外很受欢迎,尤其是在 设计/web开发/IT 人员圈子里.普通用户喜 ...

  2. 程序员必看:如何降低APP软件开发的成本?

    程序员必看:如何降低APP软件开发的成本? 作为一名曾经的程序猿,一直想写一点东西给大家分享一下,今天终于动笔了,写写我们在开发的过程中怎样才能更快更好的进行开发,降低app开发成本.无论是个人开发者 ...

  3. 空指针异常 自动拆箱 防止 NPE,是程序员的基本修养 本手册明确防止 NPE 是调用者的责任。

    空指针异常 空指针异常是指java中的异常类.   中文名 空指针异常 外文名 NullPointerException 当应用程序试图在需要对象的地方使用 null 时,抛出该异常.这种情况包括: ...

  4. Code Review 程序员的寄望与哀伤

    一个程序员,他写完了代码,在测试环境通过了测试,然后他把它发布到了线上生产环境,但很快就发现在生产环境上出了问题,有潜在的 bug. 事后分析,是生产环境的一些微妙差异,使得这种 bug 场景在线下测 ...

  5. 传播正能量&mdash;&mdash;做一个快乐的程序员

    引子 今天在博客园看到施瓦小辛格的文章我们搞开发的为什么会感觉到累,顿时有感而发.自己本来不擅长写文章,更不擅长写这种非技术性的文章,但是在思绪喷薄之际,还是止不住有很多话要说.针对从客观上说&quo ...

  6. 【腾讯Bugly经验分享】程序员的成长离不开哪些软技能?

    本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/57ce8068d4d44a246f72baf2 Dev Club 是一个交流移动 ...

  7. Java 程序员们值得一看的好书推荐

    "学习的最好途径就是看书",这是我自己学习并且小有了一定的积累之后的第一体会.个人认为看书有两点好处: 能出版出来的书一定是经过反复的思考.雕琢和审核的,因此从专业性的角度来说,一 ...

  8. 【转】成为Java顶尖程序员 ,看这10本书就够了

    “学习的最好途径就是看书“,这是我自己学习并且小有了一定的积累之后的第一体会.个人认为看书有两点好处: 1.能出版出来的书一定是经过反复的思考.雕琢和审核的,因此从专业性的角度来说,一本好书的价值远超 ...

  9. 程序员眼中的 SQL Server-非聚集索引能给我们带来什么?

    写在前面 最近在做的一个项目,页面访问的时候很慢(大概几秒钟的样子),然后用日志记录的方式,来排查这个问题,最后发现是 Entity Framework 初始化的一个坑(大概要花 6-7 秒),详见: ...

  10. Github上安卓榜排名第2的程序员教你如何学习【转载,侵删】

    来自:峰瑞资本(微信号:freesvc)文章作者:代码家(微信 ID:daimajia_share) 软件早已吞噬整个世界,程序员是关键角色.过去 40 年中,许多伟大的公司都由程序员缔造,比如比尔· ...

随机推荐

  1. 操作jQuery

    ==================================== $('img').each(function(){ this.alt='This is image['+n+'] with a ...

  2. EasyUI DataGrid 分页实现示例

    使用easyui可以很方便的开发web程序,这儿仅展示一个后台使用mvc来实现分页的示例,截图如下 示例代码如下 1. 创建模型类,代码如下 using System; using System.Co ...

  3. js 监听输入框输入事件兼容ie7

    $(element).bind("input propertychange",function(){});

  4. 【转载】CentOS 6.3下rsync服务器的安装与配置

    一.rsync 简介 Rsync(remote synchronize)是一个远程数据同步工具,可通过LAN/WAN快速同步多台主机间的文件,也可以使用 Rsync 同步本地硬盘中的不同目录. Rsy ...

  5. 命令行重新安装.net framework

    ①运行cmd ②运行命令: cd c:\\windows\\microsoft.net\\framework\v4.0.30319 ③在上述目录下执行如下命令 aspnet_regiis.exe -i ...

  6. JS数组定义

     JS数组定义收藏 function StorePage(){d=document;t=d.selection?(d.selection.type!='None'?d.selection.create ...

  7. C#语法——元组类型

     元组Tuple   我们现在使用的C#语法已经可以满足日常的开发需求,但C#语法还在进行版本的更新,在创造更多更优秀的语义来让我们使用.这里介绍一下C#5.0里的提供的语法——元组. 在C#中定义T ...

  8. oracle Data Modeler 使用教程

    由于 powerdesigner 的版权问题.公司要求集体换成 oracle Data Modeler .免费版就够用,哈哈.这有很详细的入门教程,看一看吧: 官方正版教程 ,特详细,只是英文的,也只 ...

  9. 《ABCD组团队》第二次作业

    ABCD组:二手车价格预测系统 项目 内容 这个作业属于哪个课程 http://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.c ...

  10. java根据#号截取字符串,使用Pattern的方法

    public class Regex1 { public static void main(String[] args) { String s = "神秘的海洋出现了一只#话题#海怪阿拉斯加 ...