NullPointerException double linked list



在查看线程后,我发现NullPointerException非常典型,但对于每个代码也非常具体。

我尝试了不同的建议,但没有一个是适合我的。我想构建一个双链表,最后一个列表元素的指针应该指向一个"null"元素,就像这个例子一样。

DVL Wiki示例

我希望你能给我一个线索,为什么我得到NullPointerException:

private IListElement current, prev, next;
private IValueElement dummy = new ValueElement("Head", 0);
private IListElement head = new ListElement(dummy);
private IValueElement wert;

public void deleteAllOf(IValueElement value)
{
    current=head;
    count = 0;
    for(i=0;i==numNodes;i++)
    {
        next=current.getSuccessor();
        current=next;
        wert = current.getValueElement();
        if(wert == value)
        {
            prev = current.getPredecessor();
            next = current.getSuccessor();
            next.setPredecessor(prev);
            prev.setSuccessor(next);
            count+=1;
        }
    }
    numNodes= numNodes-count;
} 

错误码:

StackTrace java.lang.NullPointerException atimplementierung.List.deleteFirstOf (List.java: 178)testklassen.TestsList.testDeleteFirstOf (TestsList.java: 572)sun.reflect.NativeMethodAccessorImpl。invoke0(本机方法)atsun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java: 62)在sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java: 43)java.lang.reflect.Method.invoke(Method.java:483org.junit.runners.model.FrameworkMethod runreflectivecall 1.美元(FrameworkMethod.java: 42)在org.junit.internal.runners.model.ReflectiveCallable.run (ReflectiveCallable.java: 14)在org.junit.runners.model.FrameworkMethod.invokeExplosively (FrameworkMethod.java: 44)在org.junit.internal.runners.statements.InvokeMethod.evaluate (InvokeMethod.java: 20)在org.junit.internal.runners.statements.RunBefores.evaluate (RunBefores.java: 28)在org.junit.internal.runners.statements.RunAfters.evaluate (RunAfters.java: 31)在org.junit.runners.BlockJUnit4ClassRunner.runChild (BlockJUnit4ClassRunner.java: 66)在org.junit.runners.BlockJUnit4ClassRunner.runChild (BlockJUnit4ClassRunner.java: 1)org.junit.runners.ParentRunner.runChildren (ParentRunner.java: 166)在org.junit.runners.ParentRunner.access$0(ParentRunner.java:164) atorg.junit.runners.ParentRunner评估(ParentRunner.java: 159) 1.美元org.junit.internal.runners.statements.RunBefores.evaluate (RunBefores.java: 28)在org.junit.internal.runners.statements.RunAfters.evaluate (RunAfters.java: 31)在org.junit.runners.ParentRunner.run(ParentRunner.java:204org.junit.runner.JUnitCore.run (JUnitCore.java: 146)org.junit.runner.JUnitCore.run (JUnitCore.java: 123)unittestenvironment.TestRunner.addTestGroup (TestRunner.java: 210)unittestenvironment.TestRunnerForMetis.main (TestRunnerForMetis.java: 54)

正如其他人所说,for循环需要修复。我实际上怀疑这不是你的空指针异常的原因。据我所知,您发布的deleteAllof方法不应该做太多事情(for循环只会在numNodes == 0时执行,也就是说,如果列表开始是空的)。您发布的堆栈跟踪表明,NullPointerException发生在另一个方法deleteFirstOF中,而您没有发布该方法。

我从你的评论中怀疑你正在试图访问列表的最后null元素。由于相关代码没有发布,因此无法确定如何或为什么。只要确保你没有计算列表长度中的null并且当你迭代你的列表时你在i <长度,如果从i>

由于您只能在numNodes == 0时进入循环,因此我怀疑您在此步骤中获得空指针异常:

 wert = current.getValueElement();

您错过的是,最终您将到达列表的末尾,当前节点将没有后继节点。您需要测试列表中的下一个节点为空的情况。然而,正如其他人所说,学会使用调试器并学会仔细查看异常堆栈跟踪中调用的特定代码行。

几次打嗝....

  1. 首先在for条件中声明int i。这是一个很好的做法,而不是在开始声明int i并在整个程序中使用它。
  2. for(int i=0;i==numNodes;i++) ....您将循环到i==numNodes,因此最后一个节点的下一个指针将指向null。所以null->next会得到NullPointerException

应该是for(int i=0; i<numNodes; i++)

相关内容

  • 没有找到相关文章

最新更新