0

我的功能是:

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

开始更新 函数调用在这里:

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
4

2 回答 2

2

这是因为一旦你的边数mainObject大于零,函数就会一遍又一遍地调用自身,从而导致 stackoverflow 异常。您需要定义一个适当的终止条件。

您的数据结构中很可能有一个圆圈。

例如:

mainObject1.getEdgeAt(0).source == mainObject2
mainObject2.getEdgeAt(0).source == mainObject1

或类似的东西。事实上,您的递归调用永远不会终止。

于 2014-01-22T11:47:34.963 回答
1

正如您所展示的,在注释的 for 循环中,您正在循环遍历 mainobject 中的所有 getedge,在递归调用的情况下,您也必须减少主对象的边缘。您必须减少已在流程中处理的边缘,以便当您到达下一个级别时,一个边缘消失了。

而且您还必须确保您正在为 Line 对象执行 getsource ,它将如何达到没有更多边缘要处理的级别,以便您的终止条件正常工作。

于 2014-01-22T11:52:29.313 回答