当前位置: 首页 > 知识库问答 >
问题:

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

董高朗
2023-03-14

我正在设计一个名为unlink Node的非静态无效方法,它将节点n作为参数。它应该确保节点与它之前和之后的节点解除链接。它需要改变n后节点的prev和n前节点的下一个。目前,当我运行它时,我得到了错误

[ 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.getPrev(). 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;
        }
    }
}

共有3个答案

巢靖
2023-03-14

仔细考虑一下逻辑。或者自己画一幅画。

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

假设nextprevheadtail有其直观的含义,测试head!=n并不意味着n将有一个下一个。这意味着n将有一个prev

而且从列表中删除节点时,head怎么可能是null?只有当列表为空时,该字段才会为null,并且您不会从空列表中删除任何内容。

因此,上述情况可能是:

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

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

(注:我不能测试它。如果我建议的修复方法是错误的,请找出它应该适合你自己。从第一原则,像我一样。)

段干华晖
2023-03-14

我怀疑"getPrev"返回空。要确认这一点需要很少的代码。您无法看到是否调用了"addhead"或"addTail"。

谭骏
2023-03-14

您似乎也在为它们分配空值,但检查还没有完成。我建议你抛出一个NullPointerException,这样你就可以自己处理它了,比如在try-catch块中。如果值为空,这将使您做好准备,然后改为这样做。

try {
   // Your usual code here
} catch(NullPointerException e) {
   // Do something if it hit an NPE
}
 类似资料:
  • 我有一个分布式任务队列,其中的任务如下所示: 这里有一个竞争条件:如果任务队列软件在完全相同的时间启动其中两个任务,它们都将从数据库中获得相同的<code>old_path</code>,并且竞争失败者的取消链接调用失败(将失败者的新路径从未来的取消链接中孤立出来)。 有没有办法让我构建它来绕过这场比赛?如果需要,我可以从当前设计中抛出几乎任何东西。具体来说,我使用的是PostgreSQL,Pyt

  • 问题内容: 我设计了一个简单的函数来返回数学函数,该函数可用于拟合实验数据。这些功能看起来很像以下内容: 不幸的是,我在RunTimeWarnings中遇到了麻烦: 由于值太大或太小。但我无法自行解决此问题。有什么办法可以重新定义我的功能,使其在没有警告的情况下通过? 问题答案: 使用以控制在这种情况下做什么numpy的:http://docs.scipy.org/doc/numpy/refere

  • 问题内容: 我通过遵循一些pygame教程来学习Python 。 在其中我发现了关键字 self的 广泛使用,并且主要来自Java背景,我发现自己一直忘记键入 self 。例如,代替我输入,因为对我来说, rect 已经是该类的成员变量。 Java的并行的我能想到的这种情况是有前缀成员变量的所有引用与 此 。 我是否在所有成员变量前面都加上了 self 前缀,还是有一种方法可以声明它们,而不必这样

  • 问题内容: 我需要检查某个值是否为null。如果它不为null,则将一些变量设置为true。这里没有其他声明。这样的条件检查太多了。 有什么方法可以在不检查所有方法返回值的情况下处理此空检查? 我认为直接检查变量并忽略NullpointerException。这是一个好习惯吗? 问题答案: 不,在Java中捕获NPE而不是对您的引用进行空检查通常不是一个好习惯。 如果您愿意,可以使用这种东西: 或

  • 问题内容: 建议在HTML页面中使用表格(现在已经有了CSS)? 表格有什么用途?表具有哪些CSS所没有的功能? 问题答案: 一点都不。但是将表格用于表格数据。只是不要将它们用于一般布局。 但是,如果您显示表格数据(例如结果或什至是表格),请继续使用表格!

  • 问题内容: 我想创建一个XML,其中用替换空白。但是Java-Transformer逃避了&符,因此输出为 这是我的示例代码: 这是我的示例代码的输出: 有任何解决或避免的想法吗?非常感谢! 问题答案: 将文本内容直接设置为所需的字符,如有必要,序列化程序将为您转义: