你只会用 ! = null 判空?嘿嘿!

编程学习篇:用 “ ! = null “ 做判空?简直绝了! 问题 为了避免空指针调用,我们经常会看到这样的语句 ... if (someobject != null) { someobject.doCalc(); } ... 最终,项目中会存在大量判空代码,多么丑陋繁冗!如何避免这种情况?我们是否滥用了判空呢? 精华回答 这是初、中级程序猿经常会遇到的问题。他们总喜欢在方法中返回null,因此,在调用这些方法时,也不得不去判空。另外,也许受此习惯影响,他们总潜意识地认为,所有的返回都是不可信任的,为了保护自己程序,就加了大量的判... 阅读详情

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

...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方法时,就会出现空指针。另外关注:架构师专栏,在后台回复:“面试题”可以获取,高清PDF最新版3625页互联网大厂面试题。

解决这个问题的一个方式,就是使用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的方法。避免空指针的 5 个案例推荐看下。

其他回答精选

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

例如:

使用

"bar".equals(foo) 

而不是

foo.equals("bar") 

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

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

来源:https://sourl.cn/JACHuS

从零到一:DAMASK与ABAQUS联合仿真的环境配置艺术 本文详细介绍了在Ubuntu 16.04系统中配置DAMASK与ABAQUS2017联合仿真环境的完整流程,涵盖系统基础环境搭建、Python科学计算环境构建、DAMASK核心安装与配置,以及ABAQUS集成与联合调试。通过实战案例和高级调试技巧,帮助用户快速掌握有限元分析中的晶体塑性模拟技术。 阅读详情

相关推荐

【软件安装系列】Ubuntu+mysql5.7.27+Jira8.3.1+邮箱服务器配置+Confluence6.15.7安装经验和采坑总结

文章目录一、软件准备(百度云易被吞,就不放了)1.1 官网下载的新鲜的Jira和Confluence1.2 linux的jdk一份1.3 Jira和Confluence的破解程序或者破解包一份1.4 java的连接器一份二、安装过程1--java环境配置2.1 将下载下来的jdk包解压在/usr/local/java目录中2.2 写入环境变量三、安装过程2--mysql5.7.27环境配置3.1 ...

xiaosha_的博客 6896

理解和正确使用Java中的断言(assert)

随时随地阅读更多技术实战干货,获取项目源码、学习资料,请关注源代码社区公众号(ydmsq666) 一、语法形式:Java2在1.4中新增了一个关键字:assert。在程序开发过程中使用它创建一个断言(assertion),它的语法形式有如下所示的两种形式:1、assertcondition;这...

孤云博客 12万+

一次HTTP完整得请求过程

一次HTTP完整的请求过程 一,大致流程: 根据域名和DNS解析到服务器的IP地址(DNS+CDN) 通过ARP协议获得IP地址对应的物理机器得MAC地址 浏览器对服务器发起三次握手 建立TCP连接后发起HTTP请求报文 服务器响应HTTP请求,将响应报文返回浏览器 短连接情况下,请求结束通过TCP四次挥手关闭连接,长连接在没有访问服务器得若干时间后,进行连接关闭 浏览器得到响应信...

qq_40760617的博客 345

拜托!你只会用 ! = null 判空?

点击关注公众号,Java干货及时送达为了避免空指针调用,我们经常会看到这样的语句...if(someobject!=null){ someobject.doCalc();}...

Java技术栈,分享最主流的Java技术 589

【Benchmark 性能测试全指南:从核心原理到 CINEBENCH 实战解析】

本文深度拆解基准测试(Benchmark)的底层逻辑,详解数据集、工作负载、度量指标三大核心要素,分步演示测试流程与统计分析要点。结合 CINEBENCH R23 实战案例,揭秘 CPU 性能评估方法论,助你掌握系统性能量化与优化的核心技能。

rong_ha_ha的博客 6331

麒麟linux离线源码编译安装zabbix-agent

离线源码编译安装zabbix-agent

qq_37263429的博客 2269

assert断言的使用

      程序一般分为Debug 版本和Release 版本,Debug 版本用于内部调试,Release 版本发行给用户使用。assert(表达式); 的意思是:当表达式为真时,程序继续运行,如果表达式为假,那程序就会停止运行,并提示错误信息。注意:assert是一个宏,只在debug版本中起作用,在release版本中,该语句是不起任何作用的。      以下为一个使用了断言的C源程序tes

zhandoushi的专栏 1832

告别密码本!用Windows NPS给华为/华三交换机做Radius认证,SSH登录更安全

本文详细介绍了如何利用Windows NPS实现华为/华三交换机的Radius认证,提升SSH登录安全性。通过集中化管理、精细化控制和完整审计追踪,企业可告别传统密码本,大幅提升网络设备管理效率。文章包含NPS服务部署指南、交换机配置详解及调试技巧,助力企业构建安全高效的统一认证体系。

weixin_42549723的博客 421

判断字符串是否为空:出现NullPointerException?

在撸代码过程中判断字符串是否为空的时候你是否遭遇过这样一个问题: NullPointerException,不瞒你说,我是踩过这样的坑,555!!! 判断字符串非空一般都有这几个条件: str!=null , !str.isEmpty() , !"".equals(str) , 此处的isEmpty() 和 equals(); 其实效果是一样的,其实都是判断判断字符串长度为0...

ONEMORE6499的博客 910

ETAS工具导入DBC生成Com协议栈

ETAS工具导入DBC主要也是生成arxml用的,ETAS推荐使用Cobra导入,本文介绍导入过程及注意事项不管是导入DBC还是arxml,本质上都是为了生成对应的com协议栈,目的是为了减少重复的工作量,所以,前期定义好收发的矩阵很重要,一般导入一次之后,后面就可以按变更点手动更改了。

赞的博客 1714

PyTorch实战(25)——使用PyTorch构建DQN模型

深度Q网络 (Deep Q-learning Network, DQN) 在强化学习领域取得了巨大的成功和广泛的应用,PyTorch 结合 gymnasium 库为我们提供了强大的工具,支持在各种强化学习环境中测试不同类型的深度强化学习模型。在本节中,我们使用 PyTorch 框架构建使用卷积神经网络架构的 DQN 模型,模型通过自主学习掌握 Atari 经典游戏《Pong》的操作策略,最终实现击败电脑对手的竞技目标。

盼小辉丶的博客 3512

assert的使用

1.eclipse、myeclipse开启assert(断言),默认是关闭,如下: 说白了就是设置一下jvm的参数,参数是-ea或者-enableassertions   2.assert格式 (1)assert [boolean 表达式] 如果[boolean表达式]为true,则程序继续执行。 如果为false,则程序抛出AssertionError,并终止执行。 (2)assert[boo...

weixin_33871366的博客 294

看懂 SAP S/4HANA 产品主数据里的 GTIN:一串号码背后的全球商品识别与业务协同

SAP S/4HANA中的GTIN管理是企业供应链运营的关键环节。本文深入解析GTIN的业务内涵及其在SAP系统中的实现方式:1) GTIN是全球通用的商品标识码,不同于企业内部物料编码;2) SAP主数据中GTIN与计量单位强绑定,需为不同包装层级维护独立GTIN;3) 同一产品可能因渠道、供应商差异存在多个GTIN;4) GTIN贯穿零售POS、仓储管理、EDI订单等核心业务流程;5) 通过典型案例说明错误维护GTIN将导致收银异常、仓库作业低效等运营问题。文章强调GTIN管理需结合包装层级、计量单位等

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1433

学妹说你是不是只会用 ! = null 判空?嘿嘿!

为了避免空指针调用,我们经常会看到这样的语句 ...if (someobject != null) { someobject.doCalc();}... 最终,项目中会存在大量判空代码,多么丑陋繁冗! 如何避免这种情况?我们是否滥用了判空呢? 精华回答 这是初、中级程序猿经常会遇到的问题。 他们总喜欢在方法中返回null,因此,在调用这些方法时,也不得不去判空。 另外,也许受此习惯影响,他们总潜意识地认为,所有的返回都是不可信任的,为了保护自己程序,就加了大量的判空。 吐槽完毕,回到这个题目本身

VX13308414401的博客 300

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

你只会用 ! = null 判空?嘿嘿!,java软件开发面试题目

null 是一个有效有意义的返回值(Where null is a valid response in terms of the contract;如果要用equal方法,请用object<不可能为空>.equal(object<可能为空>))null是无效有误的(Where it isn’t a valid response.)你可能还不明白这两句话的意思,不急,继续往下看,接下来将详细讨论这两种情况。冗余:每获取一个对象,就判一次空。第1种情况会更复杂一些。对比下面两份调用实例。

weixin_45298122的博客 470

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

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

1、假如方法的返回类型是collections,当返回结果是空时,你可以返回一个空的collections(empty list),而不要返回null,这样调用侧就能大胆地处理这个返回,例如调用侧拿到返回后,可以直接print list.size(),又无需担心空指针问题。例如你开发了一个接口,id是一个必选的参数,如果调用方没传这个参数给你,当然不行。这种情况下,null是个”看上去“合理的值,例如,我查询数据库,某个查询条件下,就是没有对应值,此时null算是表达了“空”的概念。我们是否滥用了判空呢?

m0_46163918的博客 8188

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

各类链表判空条件

——> 转自原博客 1.单链表 带头结点: 分析: 带有头节点的链表若为空,只需要整条链表只剩一个头节点 [这是和不带头节点的链表的一个很大的区别(不带头结点的链表若要为空,整个链表不能存在一个结点)], 怎样使带头节点的链表只剩一个头节点呢? 只需要第一个存储数据的节点不存在即可,即头节点的后继结点不存在即可 所以只需要头节点的next指针域不存在即可(实质上使指向NULL) 所以 带头点的单链表的判空条件为 head->next=NULL 不带头结点: 分析: 若要不带头结点的链表为空,

abcdeasdfas的博客 1万+

彻底搞清链表的判空条件

声明:以下头指针都是指向链表的第一个结点(有头节点就指向头结点,没有头节点就指向第一个存储数据的结点),并且默认一下头结点的数据域不存储数据信息 1、单链表 无头结点 分析:带有头节点的链表若为空,只需要整条链表只剩一个头节点,这是和不带头节点的链表的一个很大的区别(不带头结点的链表若要为空,整个链表不能存在一个结点),怎样使带头节点的链表只剩一个头节点呢?只需要第一个存储数据的节点不存在即可,即头节点的后继结点不存在即可,所以只需要头节点的next指针域不存在即可(实质上使指向NULL),所以带头点的

weixin_54793519的博客 1万+

判空,空字符串,空对象,判null,判undefined等

vue判断input输入内容全是空格 问题:由于字符串内容为空的时候,会出输入空格通过的情况,因此在vue通过数组长度的方式进行判空; 逻辑:先把msg以空格拆分成数组,然后拼接起来,判断字符串的长度,如果长度为0,就是没有输入内容,如下: msg.split(" ").join("").length === 0 Vue中可用的判断对象是否为空的方法,两种方法: JSON.stri...

小糖穿越火线 1万+

谈谈在 Java 中如何优雅地判空 NULL!

点击上方“Java基基”,选择“设为星标”做积极的人,而不是积极废人!源码精品专栏原创 | Java 2020超神之路,很肝~中文详细注释的开源项目RPC 框架 Dubbo 源码解析...

weixin_44421461的博客 9975

Java 判空的常见方法以及工具类的总结

isBlank() 方法是在 JDK 11 中新增的,能够判断字符串是否为空或全为空格,因此不需要再使用 trim() 方法进行判断。另外,两段代码还有一个细微的差别。第一段代码使用了 if(isBlank(data.getUserName())) 的形式进行判断,而第二段代码使用了 if(StrUtil.isBlank(data.getUserName())) 的形式。在判断集合、数组、对象是否为空时,进行非空判断时最好先判断对象是否存在,否则在对象不存在的情况下操作对象可能会导致空指针异常的发生。

白白白鲤鱼的博客 1万+
上一篇: 面试难题,不用ThreadLocal 程序会崩吗?
下一篇: 2021 年,12 个顶级开发工具,你都用过哪些?
Java思维导图
博客等级 码龄10年 306粉丝 71原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值