虚拟头声明

Dummy head declaration

dummy用来记录初始头在哪。 为什么我们必须将虚拟头设置为 Node dummy = new Node(0) 而不是 Node dummy = null。 (我这样做得到了 NPE)。我们不只需要 return 头部位置吗?为什么设置虚拟对象的值很重要?

这一切都归结为 java 中的“空”是什么,以及“实例化”对象的含义。当您将虚拟头设置为:

Node dummy = new Node(0);

您正在实例化一个新的 Node 对象,它分配在堆 space 中,对其的引用被传递到“虚拟”变量中。

当你像这样设置虚拟头时:

Node dummy = null;

您没有实例化新的 Node 对象,因此没有新对象添加到堆中。根据定义,如果没有实际创建新对象,就无法引用它。这就是 null 的意思,基本上它意味着一个空引用,或者对不存在的东西的引用(同样的东西)。因为它尚未实例化,所以当您尝试引用它的字段时,您将获得 NullPointerException。

根据文档(链接如下)在下列情况下抛出空指针异常:

  • 调用空对象的实例方法
  • 访问或修改空对象的字段
  • 将 null 的长度当作一个数组来计算
  • 像数组一样访问或修改 null 的槽
  • 像抛出值一样抛出 null

您没有 post 实际导致 NPE 的代码,但我想这是上面列表中的前两个原因之一。

https://docs.oracle.com/javase/7/docs/api/java/lang/NullPointerException.html