欢迎关注方志朋的博客,回复”666“获面试宝典

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

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

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

精华回答

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

吐槽完毕,回到这个题目本身:

进行判空前,请区分以下两种情况:

  1. null 是一个有效有意义的返回值(Where null is a valid response in terms of the contract; and)

  2. null是无效有误的(Where it isn't a valid response.)

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

先说第2种情况

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

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

  1. assert 语句,你可以把错误原因放到 assert 的参数中,这样不仅能保护你的程序不往下走,而且还能把错误原因返回给调用方,岂不是一举两得。(原文介绍了 assert 的使用,这里省略)

  2. 也可以直接抛出空指针异常。上面说了,此时 null 是个不合理的参数,有问题就是有问题,就应该大大方方往外抛。

第1种情况会更复杂一些

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

这里给一些实践建议:

1、假如方法的返回类型是 collections,当返回结果是空时,你可以返回一个空的 collections(empty list),而不要返回 null,这样调用侧就能大胆地处理这个返回,例如调用侧拿到返回后,可以直接 print list.size(),又无需担心空指针问题。(什么?想调用这个方法时,不记得之前实现该方法有没按照这个原则?所以说,代码习惯很重要!如果你养成习惯,都是这样写代码(返回空collections 而不返回 null),你调用自己写的方法时,就能大胆地忽略判空)

2、返回类型不是 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 的方法。

其他回答精选:

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

例如:

使用

"bar".equals(foo)

而不是。

foo.equals("bar")

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

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

stackoverflow 链接:http://stackoverflow.com/questions/271526/avoiding-null-statements-in-java?page=2&tab=votes#tab-top

来源 | blog.csdn.net/lizeyang/article/details/40040817

热门内容:
  • 我研究了一个月阿里的岗位JD,不曾想.....

  • 腾讯 Code Review 规范出炉!

  • 如果从 0 开发电商平台,要用到哪些组件和框架?大多数人都说不全!

  • 0.2秒居然复制了100G文件?

  • 华为最美小姐姐,被外派墨西哥后...

最近面试BAT,整理一份面试资料《Java面试BAT通关手册》,覆盖了Java核心技术、JVM、Java并发、SSM、微服务、数据库、数据结构等等。
获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。

明天见(。・ω・。)ノ♡

Stackoverflow 高赞答案,为什么牛逼的程序员都不用 “ ! = null ' 做判空相关推荐

  1. Stackoverflow 高赞答案,为什么牛逼的程序员都不用 “ ! = null ' 做判空?

    来源:blog.csdn.net/lizeyang/article/details/40040817 为了避免空指针调用,我们经常会看到这样的语句. ... if (someobject != nul ...

  2. 为什么牛逼的程序员都不用 “ ! = null 做判空?

    点击上方 好好学java ,选择 星标 公众号重磅资讯,干货,第一时间送达 今日推荐:分享一套基于SpringBoot和Vue的企业级中后台开源项目,这个项目有点哇塞!个人原创100W +访问量博客: ...

  3. 为什么牛逼的程序员都不用 “ ! = null “ 做判空?

    问题 为了避免空指针调用,我们经常会看到这样的语句 ... if (someobject != null) {someobject.doCalc();} ... 最终,项目中会存在大量判空代码,多么丑 ...

  4. 一元流量参数为null_为什么牛逼的程序员都不用 “ ! = null quot; 做判空?

    问题 为了避免空指针调用,我们经常会看到这样的语句 ...if (someobject != null) {someobject.doCalc();}... 最终,项目中会存在大量判空代码,多么丑陋繁 ...

  5. 牛逼的程序员,都长什么样?

    程序员,是世界上少有的能改变世界的人! 在程序员圈子里,有很多如明星般闪耀的牛人! 有中国第一代程序员求伯君: 有获得图灵奖的姚期智: 有产品取得巨大成功的张小龙: 有开创信息推荐新模式的张一鸣... ...

  6. 如何成为牛逼的程序员

    著作权归作者所有. 商业转载请联系作者获得授权,非商业转载请注明出处. 作者:vczh 链接:http://zhuanlan.zhihu.com/vczh-nichijou/19796639 来源:知 ...

  7. 如何成为一个牛逼的程序员

    一个快乐的人,不是因为他拥有的多,而是因为他计较的少:心态比勤劳更重要,用心做好事. 作为程序员,身边总是有牛逼的前辈.后辈或者同辈.牛逼的人总是让人羡慕.比如自己苦搞一天的 BUG ,头发快抓掉完了 ...

  8. 【转】如何成为一个牛逼的程序员

    来自:http://www.cnblogs.com/preacher/p/4205277.html   说的很有道理!!! 上边这个网站不是原文网站,,,原文网站地址:http://blog.csdn ...

  9. 卧底各大程序员圈,才知道什么才是牛逼的程序员!

    来源:zhihu.com/question/27606439/answer/503448244 长期卧底各大程序员圈,总结出现实中那些牛逼程序员的主要表现症状,如下: 1.一般人写的代码花哨.重复,满 ...

最新文章

  1. java 重定向和转发 的区别
  2. 循环矩阵傅里叶对角化
  3. 微服务如何解决分布式事务
  4. 腾讯、Meta、鲁大师竞相登场,谁能开辟元宇宙社交新思路?
  5. oracle 外部表 时间戳,Hive建立外部表与时间戳转换(含建dual表,修改列名,row_number() 函数等)...
  6. maven netty 配置_使用Springboot整合开发Netty(一个表白的小案例)
  7. Spring从Bean获取的实例从单例变成多例(IOC依赖注入)
  8. JBPM 3.3.0 + JBOSS 4.2.3 + ORACLE 9i
  9. 十大经典排序算法整理汇总(附代码)
  10. oracle滚动统计,sql – 按月滚动或运行Oracle总计
  11. cocos2d 帧序列动画
  12. 聚类之详解FCM算法原理及应用
  13. 计算机网络定义记不住,win10下微软拼音输入法记不住自定义输入词语怎么办
  14. 可执行bin文件的制作
  15. ffmpeg安装教程(windows版)
  16. oracle 数据类型是什么,oracle的数据类型有哪些?
  17. 基于CSS盒模型的页面布局
  18. 矩阵乘法的实现(一般形式及单个矩阵的n次幂)
  19. HDU神、上帝以及老天爷(错排公式)
  20. Splunk 常见问题解答

热门文章

  1. php数据分析引擎,PHP数据分析引擎计算余弦相似度算法示例
  2. Python将小于0的书数换成0的几种方式
  3. 事件流--事件冒泡现象及阻止
  4. [VBScript] 自动删除2小时以前生成的文件
  5. Python LEGB (Local, Enclosing, Global, Build in) 规则
  6. 大话设计模式读书笔记--4.代理模式
  7. mysql帐号,权限管理
  8. Select Top在不同数据库中的使用
  9. Android, BaseAdapter 处理大数据量时的优化
  10. 摄像机的几个重要的技术指标