历史上的今天:编程语言中null引用的十亿美元错误
这是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引用的十亿美元错误相关推荐
- 在众多编程语言中,你可知哪种语言的安全性更高,安全漏洞最少?
编程语言之争,一直以来是开发者社区的热议问题,因为开发者喜欢证明自己所使用的编程语言占据主导地位,尤其是安全性,只不过讨论的过程往往都伴随着双方的愤怒,最后不了了之.那么,你可知在众多热门编程语言中, ...
- python为什么从0开始_为什么大多数编程语言中,索引都是从0开始
为什么大多数编程语言中,索引都是从0开始 世界上绝大多数语言,但凡涉及到了索引这个概念,索引都是从0开始的,对于初学者,难免觉得别扭,毕竟生活中,但凡涉及到和顺序有关的概念,都是从1开始的,那么为什么 ...
- python 计算机程序设计-计算机编程语言中,为何Python独得恩宠?
原标题:计算机编程语言中,为何Python独得恩宠? 截止到2019年6月,根据Indeed网站的统计分析,美国Python开发人员的平均年薪为117,822美元. 相比Java从业者的年薪 $102 ...
- “Null 是价值十亿美元的错误!”
"不健康"的代码到处都是Null检查! 作者 | James Hickey 译者 | 弯月,责编 | 郭芮 出品 | CSDN(ID:CSDNnews) 以下为译文: 你是否知道提 ...
- C语言中NULL的定义
用C语言编程不能不说指针,说道指针又不能不提NULL,那么NULL究竟是个什么东西呢? C语言中又定义,定义如下: #undef NULL #if defined(__cplusplus) #defi ...
- c+语言+null,C/C++语言中NULL、'\0’和0的区别
NULL.'\0'和0的值是一样的,都是0,不过它们的表现形式不一样: 1. NULL: 即空指针,不过在C和C++中并不一样.在VS 2013的库文件string.h中可以看到如果定义. 1 /* ...
- c语言中保存字符串实质上是,在C语言中,保存字符串“B”实质上是保存字符B和\0两个符号。...
在C语言中,保存字符串"B"实质上是保存字符B和\0两个符号. 中字符字符下列哪个选项不属于授权的事项?() 保存保存四大()之首卢浮宫是人类最伟大的一个建筑. 实质上1889年庆 ...
- 编程语言中,还有一种语言,那就是用中文来编程
编程语言有很多种,不管是JavaScript,java.还是php.还是c语言.又或者是c++等等,这些语言基本都是差不多的有相似之处,只不过就是变了一种表达形式罢了.并且在语句和语法上都存在很多相似 ...
- 编程语言中,循环变量通常都用 i?你知道为什么吗?
01 前天,我在朋友圈发了一个问题: 为什么编程中,循环变量通常都是用 i ? 没想到,回复的人这么多!要连翻好几页. 这个问题,有 2/3 的人回答正确,有少部分人知道,但是不太确定. 习惯性用 i ...
最新文章
- c#生成随机位数的汉字字符串
- tcp与ip协议的区别
- 企业文化:谦虚(谦逊,虚心)
- UVA11917 Do Your Own Homework【map】
- 精通JavaScript--06设计模式:结构型
- 图像增强-对数Log变换
- [python] Python二维码生成器qrcode库入门
- Visio画UML用例图
- 我们仨——快乐的湘军
- 程序员的自我进化:学习之道,如何更有效的学习
- 罗彻斯特大学计算机科学系专业排名,罗切斯特大学优势专业及优势专业排名(USNEWS美国大学排名)...
- 怎么快速做动态图?gif动图在线怎么制作?
- python使用xpath爬取网页数据
- Android WebView 加载https网页白屏,空白解决方案
- Mac版excel如何快速进行数据拆分?
- 【SQL Server】列转行 STUFF 函数
- 机器学习笔记(二)——特征工程
- HorizontalScrollview+recycleview实现横向滑动
- 经典名句_万金油_新浪博客
- Qt项目背景图片无法显示