2014-01-22 69 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