Java 反向链接列表-空指针异常

Java 反向链接列表-空指针异常,java,linked-list,nullpointerexception,singly-linked-list,Java,Linked List,Nullpointerexception,Singly Linked List,我正在编写一个Java函数来反转一个链接列表。我是Java新手,未能成功调试下面函数中的错误。IDE返回一个我似乎无法理解的NullPointerException。任何帮助都将不胜感激 public listNode reverseLinkedList(listNode head) { listNode reversedLinkedList = head; listNode temp = null; while (reversedLinkedList != null)

我正在编写一个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
发生的位置。我已经做到了。它出现在行
reversedLinkedList=reversedLinkedList.getNext()中
while
循环的第二次迭代中

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

我建议你

  • 阅读错误消息以查找发生NullPointerException的确切行
  • 使用调试器逐步检查代码并查看变量为null的原因
这里没有任何代码可以生成空指针异常,因此我假设您在错误的位置查找。我建议你按照上面的两个步骤去做,而不是猜测

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

这里没有任何代码可以生成空指针异常,因此我假设您在错误的位置查找。我建议您按照以上两个步骤操作,而不是猜测。

问题可能在于最后一个节点,您将无法获取下一个节点,因为它为空

 reversedLinkedList = reversedLinkedList.getNext();

不过不确定

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

 reversedLinkedList = reversedLinkedList.getNext();

不过不确定

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

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

reversedLinkedList = reversedLinkedList.getNext();
temp
为空,因此
reversedLinkedList
将为空

在更改临时变量之前,需要存储指向临时变量的下一个指针


但这并没有导致异常。请发布完整的代码和异常的堆栈跟踪

您的推理存在缺陷。当你(第一步)

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

reversedLinkedList = reversedLinkedList.getNext();
temp
为空,因此
reversedLinkedList
将为空

在更改临时变量之前,需要存储指向临时变量的下一个指针



但这并没有导致异常。请发布完整的代码和异常的堆栈跟踪

如果您在调试器中运行它,它应该会在出现异常的行上停止,为您提供大量线索。正如Oli所指出的,您应该会得到一条特定的行,告诉您异常发生的位置。通过浏览列表,确保(如果列表是单链接的)在切换其指针之前没有取消引用节点——这只会清除列表(头除外)。异常堆栈跟踪也应该如此。;)有人建议我使用调试器来识别nullexception发生的位置。我已经做到了。它出现在while循环第二次迭代的行“reversedLinkedList=reversedLinkedList.getNext();”中,我用8个指针初始化了链表以进行测试。while循环没有转到第二个节点,而是看到一个空指针。它可能与temp变量有关,但我不确定。如果在调试器中运行它,它应该会在出现异常的行上停止,这给了您很多线索。正如Oli所指出的,您应该得到一个特定的行,告诉您异常发生的位置。通过浏览列表,确保(如果列表是单链接的)在切换其指针之前没有取消引用节点——这只会清除列表(头除外)。异常堆栈跟踪也应该如此。;)有人建议我使用调试器来识别nullexception发生的位置。我已经做到了。它出现在while循环第二次迭代的行“reversedLinkedList=reversedLinkedList.getNext();”中,我用8个指针初始化了链表以进行测试。while循环没有转到第二个节点,而是看到一个空指针。它可能与temp变量有关,但我不确定。不,这不会引发异常:
reversedLinkedList
将为null不,这不会引发异常:
reversedLinkedList
将为null我明白了。谢谢最后是一个小错误。难以置信我错过了它我认为这是导致异常的原因,因为在下一次迭代中
reversedLinkedList.setNext(temp)被执行。由于
reversedLinkedList
如您所述被设置为
null
。@BenvanGompel不应该这样做,因为循环由
reversedLinkedList!=空
。这就是为什么我说这段代码很可能不会导致异常。@Matteo,是的,你是对的。错过了,我明白了。谢谢最后是一个小错误。难以置信我错过了它我认为这是导致异常的原因,因为在下一次迭代中
reversedLinkedList.setNext(temp)被执行。由于
reversedLinkedList
如您所述被设置为
null
。@BenvanGompel不应该这样做,因为循环由
reversedLinkedList!=空
。这就是为什么我说这段代码很可能不会导致异常。@Matteo,是的,你是对的。错过了。