1965 年 Tony Hoare 在 ALGOL 中引入 null 引用,他后来自称这是“十亿美元的错误”,因为空引用无法被类型系统区分,导致数不清的空指针异常、崩溃与防御性判空代码。

常见的避免手段:

  • Option/Maybe 类型:用 Optional<T>(Java、Rust 的 Option、Haskell 的 Maybe)把“可能没有值”显式写进类型签名,编译器强制调用方处理空情况。
  • 可空类型注解:Kotlin、TypeScript(strictNullChecks)、C# 8 的可空引用类型,让编译器静态检查空值流向。
  • 空对象模式(Null Object):返回一个行为为空的合法实现(如空列表、NoOp 对象),调用方无需判空。
  • 契约与校验:在边界(API 入参、反序列化)尽早校验并拒绝 null,内部代码约定不返回 null。

易错点:Java 的 Optional 不应作为字段或方法参数使用,主要定位是返回值;空对象模式要警惕把“缺失”悄悄吞掉。追问方向:Rust 如何用 Option 在语言层面根除空指针。