2014-01-22 71 views
0

我的功能是:Java的递归函数调用失败

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

结束时更新 它给了我一个

Exception occurred during event dispatching: 
java.lang.StackOverflowError 
+1

'edgeCount'是否受循环中所做的任何操作影响?如果不是,'堆栈溢出'是不可避免的。 – devnull

+1

'mainObject.getEdgeCount()'总是'> 0'。 – Maroun

+1

请使用一些终止条件。 –

回答

2

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

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

例如:

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

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

+0

这怎么可能?在这种情况下((Line)mainObject.getEdgeAt(0))。getSource()的下一个对象进行递归调用。 – Shaleen

+0

@Shaleen同意:) –

+1

以及我们没有看到实现,所以唯一合乎逻辑的结论是,您传递的edgecount大于零的'mxICell'对象。也许在那里也有一个圆圈 – kmera

1

如您所示,在注释循环中,您要循环遍历主对象中的所有getedge,并且在递归调用时也必须减少主对象的边界。你必须减少已经在流程中处理过的边缘,这样当你到达下一层时,一条边就消失了。

此外,您还必须确保您正在为Line对象获取源,它将会如何达到没有更多边处理的级别,以便您的终止条件正常工作。

+0

如果你仔细观察,你会看到for-loop被注释掉了。但你仍然是正确的,边缘计数从来没有(最可能的,据我们可以告诉)递归调用 – kmera

+0

有效我不是for循环,但有没有任何解释为什么'mainObject.getEdgeCount()'总是'> 0'! –

+0

你必须回答@HoussemBdr,因为它是你的代码。如果你想知道,那么请添加mainObject代码。 – Shaleen