如何在Java代码中去掉烦人的“!=null”

云栖号资讯:【点击查看更多行业资讯】
在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来!

问题

为了避免空指针调用,我们经常会看到这样的语句

if (someobject != null) {someobject.doCalc();
}

最终,项目中会存在大量判空代码,多么丑陋繁冗!如何避免这种情况?我们是否滥用了判空呢?

回答

这是初、中级程序猿经常会遇到的问题。他们总喜欢在方法中返回null,因此,在调用这些方法时,也不得不去判空。另外,也许受此习惯影响,他们总潜意识地认为,所有的返回都是不可信任的,为了保护自己程序,就加了大量的判空。

吐槽完毕,回到这个题目本身,进行判空前,请区分以下两种情况:

  • null 是一个有效有意义的返回值(Where null is a valid response in terms of the contract; and)
  • null是无效有误的(Where it isn’t a valid response.)

你可能还不明白这两句话的意思,不急,继续往下看,接下来将详细讨论这两种情况

先说第2种情况

null就是一个不合理的参数,就应该明确地中断程序,往外抛错误。这种情况常见于api方法。例如你开发了一个接口,id是一个必选的参数,如果调用方没传这个参数给你,当然不行。你要感知到这个情况,告诉调用方“嘿,哥们,你传个null给我做甚"。

相对于判空语句,更好的检查方式有两个

  • assert语句,你可以把错误原因放到assert的参数中,这样不仅能保护你的程序不往下走,而且还能把错误原因返回给调用方,岂不是一举两得。(原文介绍了assert的使用,这里省略)
  • 也可以直接抛出空指针异常。上面说了,此时null是个不合理的参数,有问题就是有问题,就应该大大方方往外抛。

第1种情况会更复杂一些

这种情况下,null是个”看上去“合理的值,例如,我查询数据库,某个查询条件下,就是没有对应值,此时null算是表达了“空”的概念。

这里给一些实践建议:

7563e2847b5a5b7decc4d24ecb7c2d976dfdf149.pnguploading.4e448015.gif转存失败重新上传取消B33931E9_D7CC_438b_87EF_FB0D0EDCF730

返回类型不是collections,又怎么办呢?

那就返回一个空对象(而非null对象),下面举个“栗子”,假设有如下代码

public interface Action {void doSomething();}public interface Parser {Action findAction(String userInput);}

其中,Parse有一个接口FindAction,这个接口会依据用户的输入,找到并执行对应的动作。假如用户输入不对,可能就找不到对应的动作(Action),因此findAction就会返回null,接下来action调用doSomething方法时,就会出现空指针。

解决这个问题的一个方式,就是使用Null Object pattern(空对象模式)

我们来改造一下

类定义如下,这样定义findAction方法后,确保无论用户输入什么,都不会返回null对象:

public class MyParser implements Parser {private static Action DO_NOTHING = new Action() {public void doSomething() { /* do nothing */ }};public Action findAction(String userInput) {// ...if ( /* we can't find any actions */ ) {return DO_NOTHING;}}
}

对比下面两份调用实例

1.冗余: 每获取一个对象,就判一次空

Parser parser = ParserFactory.getParser();
if (parser == null) {// now what?// this would be an example of where null isn't (or shouldn't be) a valid response
}
Action action = parser.findAction(someInput);
if (action == null) {// do nothing} 
else {action.doSomething();
}

2.精简

ParserFactory.getParser().findAction(someInput).doSomething();

因为无论什么情况,都不会返回空对象,因此通过findAction拿到action后,可以放心地调用action的方法。扩展一下:Java:如何更优雅的处理空值?

其他回答精选:

如果要用equal方法,请用object<不可能为空>.equal(object<可能为空>))

例如:

使用

"bar".equals(foo)

而不是

foo.equals("bar")

Java8或者guava lib中,提供了Optional类,这是一个元素容器,通过它来封装对象,可以减少判空。不过代码量还是不少。不爽。

如果你想返回null,请停下来想一想,这个地方是否更应该抛出一个异常。

【云栖号在线课堂】每天都有产品技术专家分享!
课程地址:https://yqh.aliyun.com/zhibo

立即加入社群,与专家面对面,及时了解课程最新动态!
【云栖号在线课堂 社群】https://c.tb.cn/F3.Z8gvnK

原文发布时间:2020-04-15
本文作者:lizeyang
本文来自:“互联网架构师 微信公众号”,了解相关信息可以关注“互联网架构师”

如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件至:yqgroup@service.aliyun.com 进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容。

原文链接
本文为云栖社区原创内容,未经允许不得转载。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/516362.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue TypeError: Cannot read property ‘upgrade‘ of undefined

这个错误的原因是&#xff1a; vue.config.js 中配置的 proxy 中的 target 上设置的 process.env.xxxxx 不存在。

吐血整理:手拿几个大厂offer的秘密武器!

怎样才能拿到大厂的offer&#xff1f;没有掌握绝对的技术&#xff0c;那么就要不断的学习。如何拿下阿里等大厂的offer呢&#xff0c;今天分享一个秘密武器&#xff0c;资深架构师整理的Java核心知识点&#xff0c;面试时面试官必问的知识点&#xff0c;篇章包括了很多知识点&a…

拿下 Gartner 容器产品第一,阿里云打赢云原生关键一战!

云栖号资讯&#xff1a;【点击查看更多行业资讯】 在这里您可以找到不同行业的第一手的上云资讯&#xff0c;还在等什么&#xff0c;快来&#xff01; 近日&#xff0c;Gartner 发布 2020 年公共云容器报告&#xff0c;据报告显示&#xff0c;阿里云和 AWS 拥有最丰富的产品布局…

银河证券上云 打开互联网金融思维的魔盒

云栖号案例库&#xff1a;【点击查看更多上云案例】 不知道怎么上云&#xff1f;看云栖号案例库&#xff0c;了解不同行业不同发展阶段的上云方案&#xff0c;助力你上云决策&#xff01; 近些年&#xff0c;很多证券公司纷纷设立“互联网金融”部门&#xff0c;推出创新业务&a…

如何轻松地将可访问LAN的Pod部署到Kubernetes集群上

撰者 | Jack Wallen 译者 | Katie&#xff0c;责编 | Jerry来源 | CSDN云计算封图 | CSDN 下载自视觉中国想要在Kubernetes集群上部署可访问LAN的Pod来达到目的&#xff1f;接下来就展示一下它实际上是多么容易。Kubernetes更具挑战性的方面之一是部署到集群&#xff0c;同时使…

车市下滑 领克汽车为什么逆势上扬?

云栖号案例库&#xff1a;【点击查看更多上云案例】 不知道怎么上云&#xff1f;看云栖号案例库&#xff0c;了解不同行业不同发展阶段的上云方案&#xff0c;助力你上云决策&#xff01; 2018年末开始&#xff0c;寒潮席卷中国汽车市场。热了20多年的中国车市&#xff0c;迎来…

使用Vant完成DatetimePicker 日期的选择器

效果演示&#xff1a; 代码 <template><div> <!-- 输入框形式--><van-fieldreadonlyclickablename"calendar":value"timeValue"label"日期选择&#xff1a;"placeholder"发生事故的时间点"click"showP…

彩生活云上转型 打造全球最大社区服务运营商

云栖号案例库&#xff1a;【点击查看更多上云案例】 不知道怎么上云&#xff1f;看云栖号案例库&#xff0c;了解不同行业不同发展阶段的上云方案&#xff0c;助力你上云决策&#xff01; 在房地产行业增速放缓的大环境下&#xff0c;转型焦虑几乎已经弥漫整个地产行业&#xf…

谷歌这波操作,预警了什么信号??

我们都知道谷歌爸爸收购了Cask Data一家公司。长期以来&#xff0c;谷歌致力于推动围绕 GoogleCloud 的企业业务&#xff0c;但在这方面一直被亚马逊和微软吊打&#xff0c;这次的收购正是为了弥补自身的短板。被收购的 Cask Data 是一家专门提供基于Hadoop的大型数据分析服务解…

【开发者成长】“机器学习还是很难用!”

云栖号资讯&#xff1a;【点击查看更多行业资讯】 在这里您可以找到不同行业的第一手的上云资讯&#xff0c;还在等什么&#xff0c;快来&#xff01; 机器学习仍然很难用&#xff0c;但情况开始有所改善了。 以下为译文&#xff1a; 我是一名Cortex贡献者&#xff0c;Cortex是…

这个年均开销3500万美元的 FBI 机密部门,将结合面部识别与大数据技术来调查案件...

撰者 | Thomas Brewster译者 | Katie&#xff0c;责编 | Jerry来源 | CSDN云计算FBI面部识别大数据&#xff0c;瞄准恐怖犯罪事件在发生大规模枪击或恐怖袭击后&#xff0c;调查人员可能会留有数小时的闭路电视录像&#xff0c;证人的视频或社交媒体的剪辑。以2013年的波士顿马…

节省50%部署时间的5大KS8服务

云栖号资讯&#xff1a;【点击查看更多行业资讯】 在这里您可以找到不同行业的第一手的上云资讯&#xff0c;还在等什么&#xff0c;快来&#xff01; Kubernetes已然成为IT世界的重要组成部分&#xff0c;并且仍在不断地发展壮大&#xff0c;现阶段&#xff0c;Kubernetes已经…

耗时又繁重的SQL诊断优化,以后就都交给数据库自治服务DAS吧!

作者&#xff1a;斯干&#xff0c;阿里云数据库高级技术专家 在我们业务系统中&#xff0c;数据库越来越扮演着举足轻重的角色。 和其它公司一样&#xff0c;在阿里巴巴业务场景下&#xff0c;大部分业务跟数据库有着非常紧密的关系&#xff0c;数据库一个微小的抖动都有可能…

【医疗】疫情下的医院信息化短板如何补足?

云栖号资讯&#xff1a;【点击查看更多行业资讯】 在这里您可以找到不同行业的第一手的上云资讯&#xff0c;还在等什么&#xff0c;快来&#xff01; 疫情初期&#xff0c;武汉大量患者拥挤在医院的视频在网上传播。 一时间&#xff0c;各地各级医院正尽最大努力利用信息化手…

《vue+vant 文本超出两行部分省略号显示》

今天做移动端项目&#xff0c;遇到了这个问题 面向百度后总结得到了这个结果。 首先&#xff0c;我们要知道css的三条属性。 overflow:hidden; //超出的文本隐藏 text-overflow:ellipsis; //溢出用省略号显示 white-space:nowrap; //溢出则不换行 这里不符合我们的要求所有…

这三年被分布式坑惨了,曝光十大坑

本篇主要内容如下&#xff1a;前言我们都在讨论分布式&#xff0c;特别是面试的时候&#xff0c;不管是招初级软件工程师还是高级&#xff0c;都会要求懂分布式&#xff0c;甚至要求用过。传得沸沸扬扬的分布式到底是什么东东&#xff0c;有什么优势&#xff1f;借用火影忍术风…

斗胆推荐一款刚出的微服务网关

前言 使用 API 网关作为内部服务面向客户端的单一入口&#xff0c;是一种普遍采用的架构模式。企业组织通过良好定义的 API 将内部系统向内部和外部用户公开&#xff0c;通常都会采用 API 网关来处理横向的关注点&#xff0c;包括访问控制、速率限制、负载均衡等等&#xff0c…

那些年,我们踩过的 Java 坑

前言 中国有句老话叫"事不过三"&#xff0c;指一个人犯了同样的错误&#xff0c;一次两次三次还可以原谅&#xff0c;超过三次就不可原谅了。有人指出这个“三”是虚数&#xff0c;用来泛指多次&#xff0c;所以"事不过三"不包括“三”。至于"事不过…

Google排名第一的语言,引数十万人关注:搞定它,技术大牛都甘拜下风

毋庸置疑&#xff0c;Python越来越被认可为程序员新时代的风口语言。无论是刚入门的程序员&#xff0c;还是年薪百万的 BATJ 的大牛都无可否认&#xff1a;Python的应用能力是成为一名码农大神的必要项。 所以&#xff0c;很多程序员把Python当做第一语言来学习。 但对于Python…

Vue生命周期中mounted和created的区别

一、什么是生命周期&#xff1f; 用通俗的语言来说&#xff0c;就是Vue中实例或者组件从创建到消灭中间经过的一系列过程。虽然不太严谨&#xff0c;但是也基本上可以理解。 通过一系列实践&#xff0c;现在把所有遇到的问题整理一遍&#xff0c;今天记录一下created和mounted的…