如何在自定义链表类中避免此NullPointerException



我正在设计一个名为unlinkNode的非静态void方法,该方法将Node n作为参数。它应该确保节点与之前和之后的节点取消链接。它需要更改n之后节点的prev和n之前节点的next。当前当我运行它时,我得到错误

[ ERROR    ] exception in unit test code!
java.lang.
NullPointerException
at LinkedList.unlinkNode(LinkedList.java:111)
at UNITTEST.test_default(UNITTEST.java:19)
at UNITTEST.main(UNITTEST.java:81)

第111行为n.getPrevi((.next=null;

尽管我已经放入了if语句,以确保如果n是尾,则不访问它的前一个,如果它的头,则不存取它的下一个,以确保没有null被访问。

方法如下:

public void unlinkNode(Node n) {
if(head != n && head != null) {
n.getNext().prev = null;
}
if (tail != n && tail != null) {
n.getPrev().next = null;
}
}

以及设置的代码

public class LinkedList {
public static class Node{
String key;
int value;
Node next;
Node prev;
public Node(String key, int value) {
this.key = key;
this.value = value;
}
public Node getNext() {
return next;
}
public Node getPrev() {
return prev;
}
public String getKey() {
return key;
}
public int getValue() {
return value;
}
}
private Node head;
private Node tail;
public LinkedList() {
head = null;
tail = null;
}
public Node getHead() {
return head;
}
public Node getTail() {
return tail;
}

public void addHead(String key, int val) {
Node n = new Node(key, val);
if(head == null) {
head = n;
tail = n;
} else {
head.prev = n;
n.next = head;
head = n;
}
}
public void addTail(String key, int val) {
Node n = new Node(key, val);
if(tail == null) {
head = n;
tail = n;
} else {
tail.next = n;
n.prev = tail;
tail = n;
}
}
}

您似乎也在为它们分配null值,但检查尚未完成。我建议您抛出一个NullPointerException,以便能够自己处理它,例如在try-catch块中。如果值为null,这将使您为场景做好准备,然后改为执行此操作。

try {
// Your usual code here
} catch(NullPointerException e) {
// Do something if it hit an NPE
}

我怀疑"getPrevi"返回null。这要通过几个代码来确认。您看不到是否调用了"addHead"或"addTail"。

仔细思考逻辑。或者为自己画一幅画。

if(head != n && head != null) {
n.getNext().prev = null;
}

假设nextprevheadtail具有它们的直观含义,则测试head != n并不意味着n将具有next。这意味着n将有一个prev

此外。。。从列表中删除节点时,head怎么可能是null?如果列表为空,则该字段将仅为null,并且不会从空列表中删除任何内容。

所以上面应该是:

if (head != n) {
n.getPrev().next = null;
}

并将同样的想法应用到下一次测试中。

(注意:我不能测试它。如果我建议的修复方法是错误的,请自己计算它应该是什么。像我一样,从第一原则出发。(

相关内容

  • 没有找到相关文章

最新更新