2014-01-22 3 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; 
    } 

на букву 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 
+1

Является ли 'edgeCount' затронутым чем-либо, что вы делаете в цикле? Если нет, 'Stack Overflow' неизбежен. – devnull

+1

'mainObject.getEdgeCount()' всегда '> 0'. – Maroun

+1

Пожалуйста, используйте некоторое условие завершения. –

ответ

2

Это связано с тем, что после того, как количество краев вашего mainObject больше нуля, функция вызывает себя снова и снова, что приводит к исключению stackoverflow. Вам необходимо определить правильное условие завершения.

Скорее всего, в вашей структуре данных есть круг.

Например:

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

Или что-то подобное. Факт в том, что ваш рекурсивный вызов никогда не заканчивается.

+0

Как это возможно? Рекурсивный вызов выполняется на следующем объекте, который в этом случае равен ((Line) mainObject.getEdgeAt (0)). GetSource(). – Shaleen

+0

@Shaleen согласен :) –

+1

Ну, мы не видим реализации, поэтому единственный логический вывод заключается в том, что вы передаете объекты mxICell с edgecount больше нуля. может быть, есть и кружок – kmera

1

Как вы показали, что в прокомментированном цикле, в котором вы зацикливаете все элементы getedge в mainobject, вы также должны уменьшить ребра от основного объекта в случае рекурсивного вызова. Вы должны уменьшить ребро, которое уже обработано в потоке, так что, когда вы достигнете следующего уровня, один край не исчез.

А также вы должны убедиться, что тогда вы делаете источник для объекта Line, некоторые из них достигнут уровня, на котором больше нет обработок, чтобы ваше условие завершения работало правильно.

+0

, если вы посмотрите внимательно, вы увидите, что for-loop закомментирован. но вы по-прежнему правы, счетчик краев никогда (скорее всего, насколько нам известно) нуль между рекурсивными вызовами – kmera

+0

эффективно я не зацикливаюсь, но есть ли объяснения, почему 'mainObject.getEdgeCount()' всегда '> 0'! –

+0

Что вы должны ответить @HoussemBdr, так как это код. Если вы хотите знать, что тогда, пожалуйста, добавьте также код mainObject. – Shaleen

Смежные вопросы