云栖号资讯:【点击查看更多行业资讯】
在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来!问题
为了避免空指针调用,我们经常会看到这样的语句
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算是表达了“空”的概念。
这里给一些实践建议:

返回类型不是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 进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容。

原文链接

更多行业上云案例敬请关注【阿里云云栖号】

本文为阿里云原创内容,未经允许不得转载。

modelandview为null的原因_如何在Java代码中去掉烦人的“!=null”相关推荐

  1. sqlsession.selectlist 会返回null么_如何在Java代码中去掉烦人的“!=null”

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

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

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 译者:lizeyang blog.csdn.net/lizeyan ...

  3. 如何在java代码中读取配置文件

    在日常开发过程中,我们经常需要拼接一些字符串之类的东西,而这些字符串往往是不变的,或者在java代码中多次使用到的.当然我们可以在java代码中写死,但是这样做的缺点也是有目共睹的,一旦业务需求发生变 ...

  4. Android如何在java代码中设置margin

    Android如何在java代码中设置margin,也就是组件与组件之间的间距. 代码中设置: LinearLayout.LayoutParams params = new LinearLayout. ...

  5. java 线程中创建线程_如何在Java 8中创建线程安全的ConcurrentHashSet?

    java 线程中创建线程 在JDK 8之前,还没有办法在Java中创建大型的线程安全的ConcurrentHashSet. java.util.concurrent包甚至没有一个名为Concurren ...

  6. Java poi 列移动_如何在java xssf中移動列poi

    如何將現有列數據和格式化到Apache POI中的下一列並將下一列移到右側.如何在java xssf中移動列poi 我試過了. 讓說我的代碼是這樣... XSSFCell oldCell = work ...

  7. 如何在代码中让按钮高亮_如何在C代码中插入移位寄存器

    上期内容:AI Engine到底是什么? 众所周知,标准C或C++代码是没有HDL代码的并行性和时序性的,那么如何在C代码中插入寄存器呢?Vivado HLS提供了IP库,这些IP库使得HLS可直接从 ...

  8. java aes密钥生成_如何在Java(Android)中生成与.Net中相同的AES密钥?

    我需要从.Net WebService提供的salt和密码生成 Java( Android)中的AES密钥.我需要使用与.net生成的密钥相同的密钥和相同的密码和盐(使用Rfc2898DeriveBy ...

  9. java去除不为null,JAVA代码中去掉 “!=null”

    问题 为了避免空指针调用,我们经常会看到这样的语句 最终,项目中会存在大量判空代码,多么丑陋繁冗!如何避免这种情况?我们是否滥用了判空呢? 回答 这是初.中级程序猿经常会遇到的问题.他们总喜欢在方法中 ...

最新文章

  1. 数据库种类 以及优缺点
  2. 网络数据包收发流程(三):e1000网卡和DMA
  3. 财务需要学python-8年老财务:财务分析学python就能提高效率?一半人是骗子
  4. MyBatis的运行的核心原理解析(三)
  5. [python] 基于k-means和tfidf的文本聚类代码简单实现
  6. MongoDB 表结构分析工具介绍 -- Variety
  7. 处理CoreAVC Professional Edition 错误的方法
  8. 北京今日限行 API数据接口
  9. Retina屏而被图处理
  10. SAP SEGW 事物码里的 ABAP 类型和 EDM 类型映射的一个具体例子
  11. 游戏智能中的AI——从多角色博弈到平行博弈
  12. 百度文库上传总是被私有,如何正确上传百度文库
  13. 解决win7被node.js抛弃的问题 - 1)npm/node_modules/node/bin/node: line 1: This: command not found 2)win8.1或以上
  14. 小米智能插座、小米温湿度计2、涂鸦灯泡 接入Home Assistant
  15. html和css实现导航栏样式
  16. 2021年总结 2022年展望
  17. 2022年机器人工程毕业设计选题情况
  18. JAVA SE知识整合(暂时完结 五万七字)后续分点详解
  19. 最简单的将PPT转化成动态GIF
  20. python 计算结果 nan_python中的nan是什么意思

热门文章

  1. Foreman安装配置
  2. UNIX高级环境编程(9)进程控制(Process Control)- fork,vfork,僵尸进程,wait和waitpid...
  3. vaddin使用技巧
  4. “示范性高中”害死人呐!
  5. V3S文件系统基本构架
  6. BLE主机主动扫描和被动扫描
  7. 209计算机考试题库,计算机考试题库:计算机考试模拟练习题(209)
  8. linux sort命令 性能,linux sort 命令详解
  9. C++ Primer 5th笔记(chap 19 特殊工具与技术)异常类层次
  10. PKI/CA (4)根CA信任模型“证书构建”