Java递归函数失败

时间:2014-01-22 11:45:52

标签: java recursion jgraph

我的功能是:

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

2 个答案:

答案 0 :(得分:2)

这是因为一旦mainObject的边数大于零,该函数就会一遍又一遍地调用自身,从而导致堆栈溢出异常。您需要定义正确的终止条件。

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

例如:

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

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

答案 1 :(得分:1)

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

而且你还必须确保那时你正在为Line对象做getource,它会有一些如何到达没有更多边缘处理的级别,以便你的终止条件正常工作。