我正在尝试遍历图中的顶点并列出它们的边缘。到目前为止,我已经能够提出以下代码:
public String displayRecords()
{
String printOut = null;
for (ListIterator<Vert> iter = graph.listIterator(); iter.hasNext(); )
{
Vert displayVert = iter.next();
boolean cont = true;
int floop = 0;
Edge tempEdge = null;
//extra vars
String pname = null;
String sname = null;
int dist = 0;
do
{
if(floop == 0)
{
tempEdge = displayVert.firstEdge;
pname = displayVert.name;
sname = tempEdge.parentNode.name;
dist = tempEdge.edgeLen;
floop++;
}else{
tempEdge = tempEdge.nextEdge;
}
printOut = printOut + pname + sname + dist + "Plane";
}while(tempEdge.nextEdge.parentNode != null);
}
return printOut;
}
但是,我一直在这一行获得NullPointerException
:
}while(tempEdge.nextEdge.parentNode != null);
以下是Vert
和Edge
类的代码:
class Vert {
public Edge firstEdge;
public String name;
// other node info here
public Vert() {
firstEdge = null;
}
public Vert(String n)
{
firstEdge = null;
name = n;
}
}
class Edge {
public Vert parentNode = null;
public Edge nextEdge = null; // next in adj list
// other edge info here
public int edgeLen; // edge length
public Edge(Vert num, Edge e, int len) {
parentNode = num;
nextEdge = e;
// initialize other edge info here
edgeLen = len;
}
}
我做错了什么,有更简单的方法吗?
答案 0 :(得分:0)
您将tempEdge
设置为空,将floop
设置为0
,这意味着else
语句将会运行。我觉得这是NullPointerException
发生的地方。否则,如果您未将nextEdge
字段设置为任何内容,则该字段将为null
,当您尝试通过NullPointerException
字段访问时,您将获得parentNode
这个null
项。
将tempEdge
初始化为null
以外的其他内容,或将while循环更改为:
while(tempEdge.nextEdge != null && tempEdge.nextEdge.parentNode != null);
如果nextEdge
字段为null
,则会中断。如果不是,您可以安全地进入下一个条件,这是您真正想要测试的条件。
答案 1 :(得分:0)
这是你的问题:
tempEdge = tempEdge.nextEdge;
如果您让循环运行的时间足够长,最终您将tempEdge
设置为null
,然后将您的条件设置为:
}while(tempEdge.nextEdge.parentNode != null);
将抛出NullPointerException
。您可能希望将其修改为
}while(tempEdge != null && tempEdge.parentNode != null);
这样,当tempEdge
为null
时,do while循环将会中断,即当您离开列表的边缘时,或者当parentNode
null
为tempEdge
时{1}}。
很酷的是,如果null
实际上是tempEdge.parentNode
,那么在检查NullPointerException
之前条件会评估为false,因此条件不应该抛出NullPointerException
。
现在,如果在此之后你仍然得到tempEdge
,那么唯一的答案就是第一次通过它时它会被破坏。 do while循环总是运行一次,即使条件不满足也是如此。如果发生这种情况,则表示您的第一个null
有一个parentNode
{{1}},这可能是一个设计问题,而不是其他任何问题。