虚拟头声明
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
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