循环通过图的边和顶点时出现NullPointerException

时间:2014-08-07 14:11:24

标签: java loops graph nullpointerexception iteration

我正在尝试遍历图中的顶点并列出它们的边缘。到目前为止,我已经能够提出以下代码:

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;
   }

}

我做错了什么,有更简单的方法吗?

2 个答案:

答案 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);

这样,当tempEdgenull时,do while循环将会中断,即当您离开列表的边缘时,或者当parentNode nulltempEdge时{1}}。

很酷的是,如果null实际上是tempEdge.parentNode,那么在检查NullPointerException之前条件会评估为false,因此条件不应该抛出NullPointerException

现在,如果在此之后你仍然得到tempEdge,那么唯一的答案就是第一次通过它时它会被破坏。 do while循环总是运行一次,即使条件不满足也是如此。如果发生这种情况,则表示您的第一个null有一个parentNode {{1}},这可能是一个设计问题,而不是其他任何问题。