这是Jerry 2021年的第 10 篇文章,也是汪子熙公众号总共第 281 篇原创文章。

今天是2021年1月17日,星期日,腊月初五。

Jerry之前收到CSDN社区赠送的新年礼物,一本台历:《了不起的程序员》,

其中1月16日,17日两天的篇幅,都在介绍托尼·霍尔(Tony Hoare), 计算机科学家,因程序设计语言定义与设计方面的杰出贡献获得1980年的图灵奖。快速排序算法的发明者。

如果想查看用ABAP实现的8种排序算法的源代码,可以查看Jerry之前的文章:

Jerry 2017年的五一小长假:8种经典排序算法的ABAP实现

本文不会讨论霍尔发明的快速排序算法,而是介绍另一个来自霍尔,如今仍然被程序员在编程语言中广泛使用的一个设计:null引用。

null引用被霍尔称为"十亿美元错误",是霍尔1965年设计ALGOL W语言时提出的。

《Java实战》中提到,在Java程序开发中使用null会带来理论和实际操作上的种种问题:

  • 它是错误之源
  • 会使你的代码膨胀
  • 自身毫无意义
  • 破坏了Java的哲学
  • 在Java的类型系统上开了口子

霍尔的名言:

我把它叫做我的“十亿美元错误”,就是在1965年发明了空引用… 我无法抵挡放进一个空引用的诱惑,仅仅是因为实现起来非常容易。

引入了空引用的编程语言,在访问引用之前,需要显式检查引用是否有效。

Java

下图第46行代码定义的print方法,输入参数是一个类型为Integer的引用。在调用引用之前,需要先判断其是否是空引用,否则程序执行时就会出现运行时异常。

ABAP

使用CHECK X IS NOT INITIAL进行防御,如果X为空引用,则不会执行CHECK语句的下一条语句。

严谨的德国人,在霍尔教授null引用的基础上,又设计出IS BOUND, IS NOT INITIAL和IS ASSIGNED这几种判断逻辑:

SAP ABAP一组关键字 IS BOUND, IS NOT INITIAL和IS ASSIGNED的用法辨析

JavaScript

第10行的print方法内部,用&&操作符的短路逻辑(short-circuit)特性来实现空引用的检测:如果传入的oPrinter是空引用,则不会执行&&后面的print调用。

而TypeScript提供的可选链(Optional Chaining),则可以在语言层面优雅地避免这个问题。

下面的TypeScript代码,使用问号构造了一个可选链。如果a为空,则表达式a?.b直接返回undefined给变量val,而不会试图去执行a.b

上图TypeScript代码,编译之后生成的JavaScript代码如下图所示,我们可以把TypeScript的可选链看成JavaScript用三元表达式实现的语法糖。

为了减轻Java程序员每次使用引用之前,显式进行非空检查的工作量,Java 8引入了一个新的工具类:Optional.

Optional仅仅是一个不含任何业务逻辑的包裹类,其value字段指向了真正的业务类。

下图是一个使用Optional工具类的例子,第11行的filter方法,传入的是一个通过Lambda Function实现的过滤条件。这行语句的语义是,对anotherName包含的字符串,进行过滤操作,检查another实例的value字段存储的引用,是否满足过滤条件(字符串长度小于6):

Optional.filter方法,无论过滤条件是否满足,返回的类型均为Optional,便于链式调用。

我第10行传入Optional对象的字符串,显然长度远远大于6,所以filter方法返回一个新的Optional对象,其value字段为null.

对于filter调用返回的Optional对象,我们可以继续调用orElse,设置一个默认值。下图第14行用orElse实现的逻辑,语义是:如果shortName包裹的value字段为空,则返回orElse方法传入的默认值。

Java 8的Optional工具类并不像TypeScript的可选链一样,后者是语言层面提供的特性,而Optional仅仅是开发包里的一个工具类。

比如Optional的静态方法of,其实现仅仅是新建一个Optional对象,去包裹传入的value引用:

orElse方法,内部实现也是一个简单的三元表达式。

看这样一个极端的例子:

Outer类有一个字段nested,类型为Nested类。Nested类有一个字段inner,类型为Inner类。Inner类包含了字段foo,类型为String,值为Jerry:

如果想从Outer类的实例出发,写一段比较健壮的代码,打印出深藏在Inner类里的foo字段,常规的写法和使用Optional的写法分别位于下图test1和test2方法,大家可以比较下,更喜欢哪一种?

值得一提的是,类似Java Optional.orElse方法,在ABAP里也存在基于语言层面的支持。

下图是ABAP 740的新语法:

上面的新语法,翻译成传统的ABAP代码如下:

由此可见,新的ABAP内表读取的语法比较简洁,能少写3行代码。

但是新语法有一个缺陷:如果it_data内表,不存在object_ext的值为cl_crm_prodil_bo_names=>gc_prod_root的记录,此时程序执行会被终止,抛出异常CX_SY_ITAB_LINE_NOT_FOUND:

当然针对这种情况,ABAP也有对应的解决方案。

下图测试代码第17行会抛出异常,而19行不会。从语义上容易理解:如果内表lt_data里不存在name为Spring2的记录,则返回开发者使用DEFAULT VALUE关键字指定的一个结构,作为默认值。

第19行执行完毕后,结构ls3的name字段为SpringInvalid, value为999.

本文从霍尔教授1965年提出的null引用作为切入点,向大家分享了Jerry工作中同空引用打交道的一些经历,感谢阅读。

ABAP专题

  • Jerry的ABAP, Java和JavaScript乱炖

  • ABAP开发人员未来应该学些什么

  • Jerry 2017年的五一小长假:8种经典排序算法的ABAP实现

  • Jerry的ABAP原创技术文章合集

  • 300行ABAP代码实现一个最简单的区块链原型

  • 使用Java+SAP云平台+SAP Cloud Connector调用ABAP On-Premise系统里的函数

  • 在SAP云平台的CloudFoundry环境下消费ABAP On-Premise OData服务

  • ABAP vs Java, 蛙泳 vs 自由泳

  • 聊聊C语言和ABAP

  • 动手使用ABAP Channel开发一些小工具,提升日常工作效率

  • 我用ABAP做过的那些无聊的事情

  • 不喜欢SAP GUI?那试试用Eclipse进行ABAP开发吧

  • 使用Visual Studio Code编写和激活ABAP代码

  • 你的ABAP程序给佛祖开过光么?来试试Jerry这个小技巧

  • 在SAP云平台ABAP编程环境上编写第一段ABAP程序

  • SAP官方发布的ABAP编程规范

  • ABAP Code Inspector那些隐藏的功能,您都知道吗?

  • 还在用ABAP进行SAP产品的二次开发?来了解下这种全新的二次开发理念吧

  • ABAP Netweaver体内的那些寄生式编程语言

  • 从SAP社区上的一篇博客开始,聊聊SAP产品命名背后的那份情怀

  • 云端的ABAP Restful服务开发

  • 如何在SAP云平台ABAP编程环境里把CDS view暴露成OData服务

  • 使用abapGit在ABAP On-Premises系统和SAP云平台ABAP环境之间进行代码传输

  • 30分钟用Restful ABAP Programming模型开发一个支持增删改查的Fiori应用

  • Jerry带您了解Restful ABAP Programming模型系列之二:Action和Validation的实现

  • Jerry带您了解Restful ABAP Programming模型系列之三:云端ABAP应用调试

  • SAP云平台上的ABAP编程环境里如何消费第三方服务

  • ABAP开发者上云的时候到了 - 现在大家可以免费使用SAP云平台ABAP环境的试用版了

  • 学而不思则罔 - SAP云平台ABAP编程环境的由来和适用场景

  • SAP云平台里的三叉戟应用

  • 如何基于Restful ABAP Programming模型开发并部署一个支持增删改查的Fiori应用

  • SAP 2019 TechEd Key Note解读:云时代下SAP从业人员如何做二次开发?

  • 有哪些ABAP关键字和语法,到了ABAP云环境上就没办法用了?

  • ABAP开发环境终于支持以驼峰命名法自动格式化ABAP变量名了

  • 利用ABAP 740的新关键字REDUCE完成一个实际工作任务

  • 一段让人瑟瑟发抖的ABAP代码

  • 昨日万圣节ABAP怪兽级代码谜团,公布答案啦

  • 介绍一种在ABAP内核态进行内表高效拷贝的方法

  • 使用SAP Cloud Application Programming模型开发OData的一个实际例子

  • 当ABAP遇见普罗米修斯

  • 使用ABAP绘制可伸缩矢量图

  • ABAP开发环境语法高亮的那些事儿

  • SAP错误消息调试之七种武器:让所有的错误消息都能被定位

  • 使用ABAP操作Excel的几种方法

  • SAP GUI里的收藏夹事务码管理工具

  • SAP GUI和Windows注册表

  • 有了Debug权限就能干坏事?小心了,你的一举一动尽在系统监控中

  • ABAP CCDEF, CCIMP, CCMAC, CCAU, CMXXX这些东东是什么鬼

  • 实现ABAP条件断点的三种方式

  • 使用SAT跟踪监控从浏览器打开的SAP应用的性能和调用栈

  • 一个13年ABAP老兵的建议:了解这些基础知识,对ABAP开发有百利而无一害

  • SAP ABAP Netweaver容器化, 不可能完成的任务吗?

  • SAP产品增强技术回顾

  • SAP API开发方法大全

  • 浅谈Java和SAP ABAP的静态代理和动态代理,以及ABAP面向切面编程的尝试

  • SAP ABAP应用服务器的HTTP响应状态码(Status Code)

  • SAP ABAP里存在Java List这种集合工具类么?CL_OBJECT_COLLECTION了解一下

  • ABAP面试题系列:写一组会出现死锁(Deadlock)的ABAP程序

  • SAP ABAP Netweaver服务器的标准登录方式讲解

  • SAP ABAP关键字语法图和ABAP代码自动生成工具Code Composer

  • SAP ABAP SM50的另类用途 - ABAP工作进程对数据库表读取操作的检测

  • 关于SAP ABAP字符变量和字符串变量字符个数的一个知识点,和一个血案

  • SAP ABAP一组关键字 IS BOUND, IS NOT INITIAL和IS ASSIGNED的用法辨析

  • SAP ABAP和Java里的弱引用(WeakReference)和软引用(SoftReference)

  • SAP AMDP介绍 - ABAP托管的HANA数据库过程

  • 给你的ABAP对象打上标签(Tag)

更多Jerry的原创文章,尽在:“汪子熙”:

历史上的今天:编程语言中null引用的十亿美元错误相关推荐

  1. 在众多编程语言中,你可知哪种语言的安全性更高,安全漏洞最少?

    编程语言之争,一直以来是开发者社区的热议问题,因为开发者喜欢证明自己所使用的编程语言占据主导地位,尤其是安全性,只不过讨论的过程往往都伴随着双方的愤怒,最后不了了之.那么,你可知在众多热门编程语言中, ...

  2. python为什么从0开始_为什么大多数编程语言中,索引都是从0开始

    为什么大多数编程语言中,索引都是从0开始 世界上绝大多数语言,但凡涉及到了索引这个概念,索引都是从0开始的,对于初学者,难免觉得别扭,毕竟生活中,但凡涉及到和顺序有关的概念,都是从1开始的,那么为什么 ...

  3. python 计算机程序设计-计算机编程语言中,为何Python独得恩宠?

    原标题:计算机编程语言中,为何Python独得恩宠? 截止到2019年6月,根据Indeed网站的统计分析,美国Python开发人员的平均年薪为117,822美元. 相比Java从业者的年薪 $102 ...

  4. “Null 是价值十亿美元的错误!”

    "不健康"的代码到处都是Null检查! 作者 | James Hickey 译者 | 弯月,责编 | 郭芮 出品 | CSDN(ID:CSDNnews) 以下为译文: 你是否知道提 ...

  5. C语言中NULL的定义

    用C语言编程不能不说指针,说道指针又不能不提NULL,那么NULL究竟是个什么东西呢? C语言中又定义,定义如下: #undef NULL #if defined(__cplusplus) #defi ...

  6. c+语言+null,C/C++语言中NULL、'\0’和0的区别

    NULL.'\0'和0的值是一样的,都是0,不过它们的表现形式不一样: 1. NULL: 即空指针,不过在C和C++中并不一样.在VS 2013的库文件string.h中可以看到如果定义. 1 /* ...

  7. c语言中保存字符串实质上是,在C语言中,保存字符串“B”实质上是保存字符B和\0两个符号。...

    在C语言中,保存字符串"B"实质上是保存字符B和\0两个符号. 中字符字符下列哪个选项不属于授权的事项?() 保存保存四大()之首卢浮宫是人类最伟大的一个建筑. 实质上1889年庆 ...

  8. 编程语言中,还有一种语言,那就是用中文来编程

    编程语言有很多种,不管是JavaScript,java.还是php.还是c语言.又或者是c++等等,这些语言基本都是差不多的有相似之处,只不过就是变了一种表达形式罢了.并且在语句和语法上都存在很多相似 ...

  9. 编程语言中,循环变量通常都用 i?你知道为什么吗?

    01 前天,我在朋友圈发了一个问题: 为什么编程中,循环变量通常都是用 i ? 没想到,回复的人这么多!要连翻好几页. 这个问题,有 2/3 的人回答正确,有少部分人知道,但是不太确定. 习惯性用 i ...

最新文章

  1. c#生成随机位数的汉字字符串
  2. tcp与ip协议的区别
  3. 企业文化:谦虚(谦逊,虚心)
  4. UVA11917 Do Your Own Homework【map】
  5. 精通JavaScript--06设计模式:结构型
  6. 图像增强-对数Log变换
  7. [python] Python二维码生成器qrcode库入门
  8. Visio画UML用例图
  9. 我们仨——快乐的湘军
  10. 程序员的自我进化:学习之道,如何更有效的学习
  11. 罗彻斯特大学计算机科学系专业排名,罗切斯特大学优势专业及优势专业排名(USNEWS美国大学排名)...
  12. 怎么快速做动态图?gif动图在线怎么制作?
  13. python使用xpath爬取网页数据
  14. Android WebView 加载https网页白屏,空白解决方案
  15. Mac版excel如何快速进行数据拆分?
  16. 【SQL Server】列转行 STUFF 函数
  17. 机器学习笔记(二)——特征工程
  18. HorizontalScrollview+recycleview实现横向滑动
  19. 经典名句_万金油_新浪博客
  20. Qt项目背景图片无法显示

热门文章

  1. 组策略管理——软件限制策略(4)
  2. vi/vim多行注释和取消注释
  3. 安装Microsoft Sysprep工具
  4. wordpress改变ip或域名
  5. QQ2007退出市场
  6. 腾讯offer-众里寻他千百度
  7. 计算机基础-软件梗概
  8. 区块链和比特币以及挖矿
  9. jquery知识巩固
  10. linux系统日常管理复习题讲解