我的功能是:
private void addEdges(mxICell mainObject, List<Object> edgesList) {
if (mainObject.getEdgeCount() > 0) {
// for (int i = 0; i < mainObject.getEdgeCount(); i++) {
edgesList.add(mainObject.getEdgeAt(0));
addEdges(((Line) mainObject.getEdgeAt(0)).getSource(), edgesList);
}
// }
else
return;
}
BEGING UPDATE 函数调用在这里:
for (Object obj : map.values()) {
if (obj instanceof Port
&& ((Port) obj).getParent().getStyle().equals("POWER")) {
String Feeder = ((Port) obj).getParent().getValue()
.toString();
List<Object> edgesList = new ArrayList<Object>();
Port p = (Port) obj;
mxICell mainObject = p;
addEdges(mainObject, edgesList);
//staff
}}
END UPDATE 它给了我一个
Exception occurred during event dispatching:
java.lang.StackOverflowError
答案 0 :(得分:2)
这是因为一旦mainObject
的边数大于零,该函数就会一遍又一遍地调用自身,从而导致堆栈溢出异常。您需要定义正确的终止条件。
您的数据结构中很可能有一个圆圈。
例如:
mainObject1.getEdgeAt(0).source == mainObject2
mainObject2.getEdgeAt(0).source == mainObject1
或类似的东西。事实是,你的递归调用永远不会终止。
答案 1 :(得分:1)
正如您所示,在注释for循环中,您正在循环遍历主对象中的所有getedge,在递归调用的情况下,您也必须减少主对象的边缘。您必须减少已在流程中处理的边缘,以便在达到下一级别时,一条边消失。
而且你还必须确保那时你正在为Line对象做getource,它会有一些如何到达没有更多边缘处理的级别,以便你的终止条件正常工作。