【问题标题】:Reverse Linked list - Null pointer exception [duplicate]反向链接列表 - 空指针异常[重复]
【发布时间】:2011-11-15 08:57:47
【问题描述】:

我正在编写一个 Java 函数来就地反转链表。我是 Java 新手,未能成功调试以下函数中的错误。 IDE 返回一个我似乎无法弄清楚的 NullPointerException。任何帮助将不胜感激。

public listNode reverseLinkedList(listNode head)
{
    listNode reversedLinkedList = head;
    listNode temp = null;

    while (reversedLinkedList != null) {
        reversedLinkedList.setNext(temp);
        temp = reversedLinkedList;
        reversedLinkedList = reversedLinkedList.getNext();    
    }
    return reversedLinkedList;
}

为了测试,我已经用 8 个链接节点初始化了一个链接列表。在上面的函数中,我试图在每个节点之间交换下一个指针,并沿着链表移动 reversedLinkedList 指针。

编辑:有些人建议我使用调试器来确定NullPointerException 出现的位置。我已经这样做了。它出现在while 循环的第二次迭代中的reversedLinkedList = reversedLinkedList.getNext(); 行中。

我用 8 个指针初始化了链表以进行测试。 while 循环没有转到第二个节点,而是看到一个 null 指针。它可能与 temp 变量有关,但我不确定。

【问题讨论】:

  • 如果你在调试器中运行它,它应该会停止在异常的线上,给你很多线索。
  • 正如 Oli 指出的那样,您应该得到一个特定的行来告诉您异常发生的位置。通过浏览它,确保(如果列表是单链接的)您在切换节点之前没有取消引用节点 - 这只会清除列表(head 除外)。
  • 异常堆栈跟踪也应该如此。 ;)
  • 有些人建议我使用调试器来确定发生空异常的位置。我已经这样做了。它出现在“reversedLinkedList = reversedLinkedList.getNext();”行中在 while 循环的第二次迭代中,我用 8 个指针初始化了链表以进行测试。 while 循环没有转到第二个节点,而是看到一个空指针。它可能与 temp 变量有关,但我不确定。

标签: java linked-list nullpointerexception singly-linked-list


【解决方案1】:

你的推理有缺陷。当你(第一步)

reversedLinkedList.setNext(temp)

您正在更改对 null 的第一个引用(这是正确的),但是您丢失了对下一个指针的任何引用。两行后你

reversedLinkedList = reversedLinkedList.getNext();

temp 为空,因此 reversedLinkedList 将为空。

您需要在更改临时变量之前存储 next 指针

但这不会导致异常。请发布完整的代码异常的堆栈跟踪

【讨论】:

  • 我明白了。谢谢。最后的小错误。不敢相信我错过了它
  • 我认为这是导致异常的原因,因为在下一次迭代中会执行 reversedLinkedList.setNext(temp);。既然reversedLinkedList 被设置为null,就像你提到的那样......
  • @BenvanGompel 不应该因为循环由reversedLinkedList != null 保护。这就是为什么我说这段代码很可能不会导致异常。
  • @Matteo,是的,你是对的。错过了。
【解决方案2】:

我会建议你;

  • 阅读错误消息以找到发生 NullPointerException 的确切行。
  • 使用调试器单步调试代码并查看变量为空的原因。

这里没有任何代码可以产生空指针异常,所以我假设你找错地方了。我建议你按照上面的两个步骤而不是猜测。

【讨论】:

    【解决方案3】:

    问题可能出在最后一个节点上,因为它为NULL,你将无法获取下一个节点!

     reversedLinkedList = reversedLinkedList.getNext();
    

    虽然不确定!

    【讨论】:

    • 不,这不会引发异常:reversedLinkedList 将只是空
    猜你喜欢
    • 1970-01-01
    • 2014-02-04
    • 1970-01-01
    • 2014-07-28
    • 2016-04-28
    • 1970-01-01
    相关资源
    最近更新 更多