繁体   English   中英

遍历图的边和顶点时发生NullPointerException

[英]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);

这是我的VertEdge类的代码:

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,并将floop0 ,这意味着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);

这样,当tempEdgenull ,即当您超出列表边缘时,或者当parentNodenull时,do while循环将中断。

很酷的事情是,如果tempEdge实际上为null ,则条件在检查tempEdge.parentNode之前将评估为false,因此该条件永远不应抛出NullPointerException

现在,如果在此之后您仍然收到NullPointerException ,则唯一的答案是,第一次使用它时它就坏了。 即使不满足条件,do while循环也始终运行一次。 如果发生这种情况,这意味着你的第一个tempEdge有一个null parentNode ,这可能是一个设计问题比什么都重要。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM