答案 0 :(得分:4)
NULL有点像上帝。如果它不存在,我们最终必须创建一个。某些东西必须代表未分配的引用的值(无论是因为它从未被分配,或者它在某个时刻被清除)。唯一的选择是使用一个有效替代NULL的对象。问题是,如果你做了所有这些以避免NullPointerException,现在你只需要用UnexpectedObject异常或ClassCastException替换它,或者不是。
答案 1 :(得分:1)
可以设计一种没有NULL的语言,而是将未初始化的值指向一个实际上没有做任何事情的单例虚拟对象。您可以将指针与此虚拟对象的引用进行比较,并且对对象上的方法的调用将导致无操作或运行时错误。
对于像C ++或Java这样的静态类型语言,这种技术很难实现。
答案 2 :(得分:0)
在具有垃圾收集的语言中,变量是实际的存储位置(与Python的标签相对),需要NULL
值以允许在变量范围结束之前以干净的方式释放内存。 / p>
此外,甚至许多用伪代码编写的算法都使用特殊的NULL
值。它随处可见。它是计算机科学的核心概念。
答案 3 :(得分:0)
通常有两个特殊值。有些语言处理两种语言,有些语言只处理1,而另一种语言则抛出错误,有些语言将两者合并。这两个值为Null
和Undefined
。
Undefined
会尝试使用不存在的变量。
Null
会尝试使用存在但无值的变量。
Null
可能很有用,因为它是一个保证值,表示某些内容有问题,或者在域/可能答案范围之外。以Java为例:
如果您没有null
,如果您在HashMap
中查找了地图中不存在的内容,该怎么办?你会回报什么?如果你返回了一个对象,那么你怎么知道对象意味着什么都没有,或者这就是Map中的实际内容。解决方法可能包括创建自己的“NON_EXIST”常量对象,但这与null
已经存在的内容基本相同。另一种解决方法可能是抛出异常。现在您正在考虑主要的性能影响。
同样,它的想法是拥有一个可以使用的保证允许值。它始终可供您使用,并且它始终与通常从您正在执行的操作返回的“真实值”集合脱节。因此,Null
故意用于表示特殊的内容。
就像我之前暗示的那样,也可以在这里进行优化,因为Null
是一个特殊值。在Java等语言中,如果您最初仅通过变量引用Object,则将该变量设置为null
,您将删除该引用并允许Java的垃圾收集器收集现在未引用的数据。相反,如果您让该变量永远存在,那么可能永远不会再次使用的内存块将继续保留资源。这是一个人为的例子,但它证明了一点,在一些资源密集型Java程序中,您将看到null
的这些显式赋值。