NullPointerException双链表

时间:2014-06-20 18:26:21

标签: java eclipse list linked-list double

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

我尝试了不同的建议,但对我来说没有人是对的。 我想构建一个双链表,最后一个listelement的指针应该指向一个“null”元素,就像这个例子一样。

DVL Wiki example

我希望你能给我一个线索,为什么我得到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 at   implementierung.List.deleteFirstOf(List.java:178)at   testklassen.TestsList.testDeleteFirstOf(TestsList.java:572)at   sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at   sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)   在   sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)   在java.lang.reflect.Method.invoke(Method.java:483)at   org.junit.runners.model.FrameworkMethod $ 1.runReflectiveCall(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)at at   org.junit.runners.ParentRunner $ 1.evaluate(ParentRunner.java:159)at at   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:204)at   org.junit.runner.JUnitCore.run(JUnitCore.java:146)at   org.junit.runner.JUnitCore.run(JUnitCore.java:123)at at   unittestenvironment.TestRunner.addTestGroup(TestRunner.java:210)at   unittestenvironment.TestRunnerForMetis.main(TestRunnerForMetis.java:54)

3 个答案:

答案 0 :(得分:0)

几次打嗝......

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

答案 1 :(得分:0)

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

我从您的评论中怀疑您正在尝试访问列表的最后一个null元素。由于未发布相关代码,因此无法确定如何或为何。只要确保你没有计算列表长度中的空值,并且当你在列表中迭代时,你会停在i&lt;长度,如果你从i = 0开始。

答案 2 :(得分:0)

因为如果numNodes == 0你只能进入循环,我怀疑你在这一步得到了空指针异常:

 wert = current.getValueElement();

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