[英]NullPointerException while Looping through Edges and Vertices of Graph
我试图遍历图中的顶点,并在行进时列出其边缘。 到目前为止,我已经能够提出以下代码:
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;
}
}
我在做什么错,有没有更简单的方法可以做到这一点?
您将tempEdge
设置为null,并将floop
为0
,这意味着else
语句将运行。 我觉得这就是NullPointerException
发生的地方。 否则,如果未将nextEdge
字段设置为任何null
,则该字段将为null
,当您尝试通过此null
项目访问字段parentNode
时,将获得NullPointerException
。
可以将tempEdge
初始化为null
以外的其他null
,或者将while循环更改为:
while(tempEdge.nextEdge != null && tempEdge.nextEdge.parentNode != null);
如果nextEdge
字段为null
,它将中断。 如果不是,则可以安全地继续进行下一个条件,这是您真正要测试的条件。
这是您的问题:
tempEdge = tempEdge.nextEdge;
如果让循环运行足够长的时间,最终将tempEdge
设置为null
,然后在此处设置条件:
}while(tempEdge.nextEdge.parentNode != null);
将抛出NullPointerException
。 您可能想将其修改为
}while(tempEdge != null && tempEdge.parentNode != null);
这样,当tempEdge
为null
,即当您超出列表边缘时,或者当parentNode
为null
时,do while循环将中断。
很酷的事情是,如果tempEdge
实际上为null
,则条件在检查tempEdge.parentNode
之前将评估为false,因此该条件永远不应抛出NullPointerException
。
现在,如果在此之后您仍然收到NullPointerException
,则唯一的答案是,第一次使用它时它就坏了。 即使不满足条件,do while循环也始终运行一次。 如果发生这种情况,这意味着你的第一个tempEdge
有一个null
parentNode
,这可能是一个设计问题比什么都重要。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.