如何解决 JUNG 图上的 NullPointerException?
How do I resolve a NullPointerException on a JUNG graph?
所以,基本上这就是我目前所拥有的。
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在超图中搜索循环。
它的想法是接收关于参数的图表,然后创建一个变量(相同类型)以稍后从中删除一个顶点而不对原始图表进行任何更改,以防循环不是成立。这样我就可以在删除顶点后使用名为 findPath(,) 的方法。该方法将 'create' 另一条路径而不穿过已删除的顶点。
我的编译器说这里有问题:
for(String d : g.getSuccessors(aux2))
我在 Java(JUNG) 中编写图表仅 1 个月。
帮助
不是使用 null
来表示没有后继者,您可以只使用一个空列表,从而避免 NullPointerException
。将 return null;
替换为 return new LinkedList<>();
.
JUNG 中有一个错误,该代码已解决——如果图形没有顶点,getSuccessors() 应该返回一个空集合,而不是返回 null,这是 SetHypergraph 的实现所做的。对于那个很抱歉。 (通常,您可以通过将 getSuccessors(x) 包装在 containsVertex(x) if 语句中来避免这种情况。)
但是,您遇到此错误的原因是您至少做了几件没有意义的事情:
(1) 您正在将 auxG 分配给 g(因此它们引用同一个对象);这是一种误导,没有帮助。
同样,您将 aux2 分配给 aux,这也会产生误导。
(2) 您要从 auxG 中删除 aux[2],然后在 auxG 中请求 aux2 的后继者。一旦 aux2 被删除,aux2 将不会在 auxG 中有任何后继者。
(3) 由于 aux2 和 aux 是同一个顶点,出于同样的原因,你的最内层循环也不会做任何有用的事情;不会有继任者。
您需要重新考虑您的整个算法,因为这根本不是设计正确的。
所以,基本上这就是我目前所拥有的。
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在超图中搜索循环。
它的想法是接收关于参数的图表,然后创建一个变量(相同类型)以稍后从中删除一个顶点而不对原始图表进行任何更改,以防循环不是成立。这样我就可以在删除顶点后使用名为 findPath(,) 的方法。该方法将 'create' 另一条路径而不穿过已删除的顶点。
我的编译器说这里有问题:
for(String d : g.getSuccessors(aux2))
我在 Java(JUNG) 中编写图表仅 1 个月。 帮助
不是使用 null
来表示没有后继者,您可以只使用一个空列表,从而避免 NullPointerException
。将 return null;
替换为 return new LinkedList<>();
.
JUNG 中有一个错误,该代码已解决——如果图形没有顶点,getSuccessors() 应该返回一个空集合,而不是返回 null,这是 SetHypergraph 的实现所做的。对于那个很抱歉。 (通常,您可以通过将 getSuccessors(x) 包装在 containsVertex(x) if 语句中来避免这种情况。)
但是,您遇到此错误的原因是您至少做了几件没有意义的事情:
(1) 您正在将 auxG 分配给 g(因此它们引用同一个对象);这是一种误导,没有帮助。 同样,您将 aux2 分配给 aux,这也会产生误导。
(2) 您要从 auxG 中删除 aux[2],然后在 auxG 中请求 aux2 的后继者。一旦 aux2 被删除,aux2 将不会在 auxG 中有任何后继者。
(3) 由于 aux2 和 aux 是同一个顶点,出于同样的原因,你的最内层循环也不会做任何有用的事情;不会有继任者。
您需要重新考虑您的整个算法,因为这根本不是设计正确的。