问题描述:

我整天都是在跟Java打交道。我在Java开发中最常用的一段代码就是用object != null在使用对象之前判断是否为空。这么做是为了避免NullPointerException。但是我发现这样检测代码实在是太丑了,而且及其不可读。

那有没有一种优雅的替代方法呢?

问题补充:

再清晰化一下我的问题,我是在强调在使用对象的属性或者方法之前,确保它不为空的重要性,就像下面这段代码一样:

这么些我是为了避免抛NullPointerException异常,我不知道这个对象是不是空的。正由于这些判空代码,导致我的代码血花四溅,相当惨不忍睹。

最佳解答:

对于我来说,这就是一个初级开发者走向中级开发者过程中有时候都会碰到的合理问题:他们不知道也不太信任自己所使用的约定,并且过度的去检查空值情况。另外,当他们写代码的时候,总是会让方法去返回一些值,因此就可以由方法调用方去检查空值了。

换句话说,有两种情况会出现判空语句:

  • null返回值按找约定是正常的返回值
  • null返回值不是正常的返回值

第二种情况很简单。可以使用assert来判断或者是允许程序报错(即抛NullPointerException)。断言是一个被充分利用的Java特性,在1.4版本中加入了这个特性。语法如下:

或者是

object的toString()输出会被包括在错误信息中。

当判断条件为false的时候assert语句就会抛出Error(AssertionError)错误。在默认情况下,Java虚拟机是不会理会断言语句的。当需要使用此特性的时候可以给JVM虚拟机传入-ea参数来启用它。同时也可以针对单个的Java类或者是包来使用断言特性。这就意味着可以在开发测试的过程中来使用断言验证代码,而在生产环境就关闭这个特性,尽管我已经测试显示断言功能并不会对应用程序产生任何影响。

这个案例中不使用断言是可以的,因为代码本身就是会报错的,就像假如你使用断言之后一定会抛出Error错误一样。用和不用的区别就是可以尽早的去发现错误,用更有意义,更加丰富的信息来描述这个错误,这样你就可以帮助你弄清楚为什么会发生这种错误(假如这种错误你确实不想它发生)。

第一种情况就要难解释一点了。如果你对你调用的代码没有控制权的话,你就惨了。如果null返回值是正常的话,那你就必须去检查它了。

如果可以控制你调用代码(当然常常还是有控制权的),那就是另一回事儿了。还是尽量的不去使用null返回值。对于返回集合的方法很简单,只需要返回空的集合就可以了,而不是null。

对于返回值不是集合的方法,就要麻烦一点了。假如碰到下面的情况:

Parse接口从标准输入中接受指令,并去执行一些操作,可能会去用这个接口实现一个命令行工具。那现在就有个约定当没找到合适的操作指令时,就返回空值。那这儿就得去验空值了。

一种可选办法就是不使用空返回值,而是空对象模式:

来对比下下面这两种:

明显下面这种写法更加简明清晰。

其实在findAction()方法中直接抛出更加有意义的错误信息是完全可以的。特别是你在依赖用户输入的应用中。对于findAction()方法来说抛出一个带有说明的异常要比光秃秃的抛出一个NullPointerException要好的多。

要是你觉得使用try/catch机制比较丑的话,那就给用户比较有意义的反馈。

distinct返回null报错_在Java中如何避免“!=null”式的判空语句?相关推荐

  1. mysql timestamp 插入null报错_读MySQL 5.7文档11.2 Date and Time Data Types总结

    作者:魏新平,知数堂第5期MySQL实战班学员,第10期MySQL优化班学员,现任职助教. 读MySQL5.7文档11.2 Date and Time Data Types MySQL的时间类型分为D ...

  2. th:text为null报错_为vue3.0的学习TS解读高级类型

    知识点摘要 本节课主要关键词为: 自动类型推断 / 类型断言 / 类型别名(type) / 映射类型(Pick/Record等...) / 条件类型(extends) / 类型推断(infer) 自动 ...

  3. th:text为null报错_小猿圈web前端之vue-cli项目打包完成后运行文件路径报错问题

    学习前端的小伙伴越来越多,问题也就越多,前面基础部分还好一些,特别是一到框架的时候,难住了一大部分人,今天小猿圈web前端讲师就为大家总结了vue-cli项目打包完成后运行文件路径报错问题,有兴趣的小 ...

  4. java js中 function函数报错_浅析JS中对函数function的理解(基础篇)

    正文:我们知道,在js中,函数实际上是一个对象,每个函数都是Function类型的实例,并且都与其他引用类型一样具有属性和方法.因此,函数名实际上是指向函数对象的指针,不与某个函数绑定.在常见的两种定 ...

  5. th:text为null报错_为什么建议你用nullptr而不是NULL?

    来源:公众号[编程珠玑] 作者:守望先生 网站:https://www.yanbinghu.com 前言 在C语言中,我们常常用NULL作为指针变量的初始值,而在C++中,却不建议你这么做. NULL ...

  6. java通讯链路异常报错_【Java】有了链路日志增强,排查Bug小意思啦!

    在工作中,相信大家最怕的一件事就是听到有人在工作群艾特你:某某功能报错啦... 然后你就得屁颠屁颠的去服务器看日志,日志量少还好点,多的话找起来太麻烦了.不太容易直接定位到关键地方. 东找找西找找,好 ...

  7. thymeleaf 使用页面报错_异常处理-SpringBoot中thymeleaf对应前台页面大于号\小于号使用问题...

    浏览器报错信息: There was an unexpected error (type=Internal Server Error, status=500). Exception parsing d ...

  8. 安装32位mysql报错_在CentOS中安装32位或64位MySql报错error: Failed dependencies解决办法...

    在CentOS中安装MySql报错error: Failed dependencies解决办法 安装64位MySql报错内容如下: error: Failed dependencies: libaio ...

  9. python下载库报错_下载python中Crypto库报错:ModuleNotFoundError: No module named ‘Crypto’的解决...

    下载python中Crypto库报错:ModuleNotFoundError: No module named 'Crypto'的解决 前言 最近在网上找了很多下载Crypto的方法,感觉作用都不算很 ...

最新文章

  1. java控制器删除数据_javaWeb删除一条及多条数据
  2. 正则表达式判断号码靓号类型
  3. Android中finish()、System.exit()、KillProcess()的区别
  4. word2vec原理(五):skip-gram和CBOW模型代码实现
  5. KEIL 默认 char 是无符号的
  6. 申明   csdn的博客wjszf 也是本人的
  7. 线程同步以及yield()、wait()、Notify()、Notifyall()
  8. 玩Docker只要浏览器就够了,PWD是个神奇的网站
  9. 基于TableStore/MaxCompute的数据采集分析系统介绍
  10. 为GridView-Delete列添加确认对话框(2种方法)
  11. JAVA File转Byte[]
  12. C#重绘TabControl控件的源码(转)
  13. php写入mysql表格失败,麻烦给我看一下为什么MySQL创建表格失败嘛
  14. SignalTap II使用技巧_2
  15. 创建和管理图书管理系统数据库
  16. 为什么领导不喜欢能干的员工?有这4个表现,你再有本事也被抛弃
  17. RGB、HSL、Hex网页色彩,看完这篇全懂了
  18. python invalid syntax 冒号_SyntaxError: invalid syntax python【解决方法】 – IT热血青年
  19. DDD到底是不是毒瘤?
  20. Markdown表格、单元格合并、快速编辑表格

热门文章

  1. WEB架构师成长之路-摘录
  2. 服务器运算性能,服务器性能计算公式(20191116215459).pdf
  3. Setup Factory 打包工具部分功能代码解
  4. java的访问修饰符
  5. 输出nc数据_NetCDF(NC)数据的使用、转换和分析
  6. c 与mysql连接_c与mysql的连接
  7. collectors 求和_Java-Collectors常用的20个方法
  8. sql 日期和当前日期时间差_SQL基础进阶16日期处理
  9. Python之网络编程(一)
  10. [译]Javascript中的mutators