如何解决JUNG图上的NullPointerException?

时间:2015-05-06 07:41:07

标签: java graph jung

所以,基本上这就是我到目前为止所做的。

public List<String> cycleSearch(Graph<String,String> g) throws Exception{
    List<String> list = null;
    Graph<String,String> auxG = g;
    for(String aux : g.getVertices()){
        String aux2 = aux;
        if(g.degree(aux)>1){
            if(auxG.removeVertex(aux2)){
            for(String d : g.getSuccessors(aux2)){
                for(String a : g.getSuccessors(aux)){
                    if(a!=d){
                        list = findPath(auxG,d,a);
                        if(list!=null){
                            list.add(0,aux);
                            list.add(aux);
                            return list;
                            }
                        }
                    }
                }
            }
        }
        auxG = g;
    }
    return null;
}

该方法的作用基本上是基于JUNG在超图中搜索循环。

接受参数图表然后创建变量(作为相同类型)以便稍后从中移除顶点而不对原始图形进行任何更改的想法,以防万一循环不是&n找到了。这样,一旦删除了顶点,我就可以使用一个名为findPath(,,)的方法。该方法将创建&#39;另一条路径没有穿过被移除的顶点。

我的编译器说这里有问题:

            for(String d : g.getSuccessors(aux2))

我在Java(JUNG)中编程图只用了一个月。 帮助

2 个答案:

答案 0 :(得分:0)

您可以使用空列表,而不是使用null来代替没有后继者,从而避免使用NullPointerException。将return null;替换为return new LinkedList<>();

答案 1 :(得分:0)

JUNG中有一个错误,这个代码已经转了 - 如果图形没有顶点,getSuccessors()应该返回一个空集合,而不是返回null,这就是SetHypergraph的实现。对于那个很抱歉。 (通常,您可以通过将getSuccessors(x)包装在containsVertex(x)if语句中来避免这种情况。)

然而,你遇到这个错误的原因是你至少做了几件没有意义的事情:

(1)你将auxG分配给g(所以他们引用同一个对象);这是误导性的,没有帮助。 同样,你将aux2分配给aux,这也是误导。

(2)你从auxG中删除aux [2],然后在auxG中询问aux2的后继。一旦它被移除,aux2就不会有任何后继的继承者。

(3)由于aux2和aux是相同的顶点,你的最内层循环也不会因同样的原因做任何有用的事情;没有接班人。

您需要重新考虑整个算法,因为这根本设计不正确。