在查看线程后,我发现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();
您错过的是,最终您将到达列表的末尾,当前节点将没有后继节点。您需要测试列表中的下一个节点为空的情况。然而,正如其他人所说,学会使用调试器并学会仔细查看异常堆栈跟踪中调用的特定代码行。
几次打嗝....
- 首先在for条件中声明
int i
。这是一个很好的做法,而不是在开始声明int i
并在整个程序中使用它。 -
for(int i=0;i==numNodes;i++)
....您将循环到i==numNodes
,因此最后一个节点的下一个指针将指向null。所以null->next
会得到NullPointerException
。
应该是for(int i=0; i<numNodes; i++)