Решить проблему с памятью java.lang.StackOverflowError - PullRequest
1 голос
/ 18 августа 2011

Я использую рекурсивную функцию, и я получаю эту ошибку при выполнении:

Exception in thread "main" java.lang.StackOverflowError
    at java.util.HashMap$Entry.<init>(Unknown Source)
    at java.util.HashMap.addEntry(Unknown Source)
    at java.util.HashMap.put(Unknown Source)

Я отладил метод и на 100% уверен, что в какой-то момент он заканчивается.

Так что я думаю, что это связано с проблемой памяти.

Есть ли какое-либо решение?

РЕДАКТИРОВАТЬ:

public static Vector<String> _toOpen;

public static void openFiles(Vector<String> files)
{       
   ...

    while(actualFile.hasNext)
    {
        if(!_toOpen.contains(word))
        {
           _toOpen.add(word);
            System.out.println("word");
        }
    }

   ...

   if(_toOpen.size() > 0)
   {
       openFiles(_toOpen);
   }
}

При первом вызове япередать в OpenFiles вектор, который содержит список файлов, которые нужно открыть, у каждого файла есть список файлов, которые нужно открыть снова и т. д. *

Я запрещаю открывать файл, если онбыл допне раньше.

Ответы [ 2 ]

4 голосов
/ 18 августа 2011

Глядя на ваш код - есть ли какие-либо условия (например, if, например) в вашем последнем звонке на openFiles(_toOpen)?

Если нет, то каждый раз, когда вызывается openFiles,он будет называть себя рекурсивно .Независимо от того, какой максимальный размер стека, этот метод никогда не вернется, и вы фактически получите бесконечный цикл.

И если есть какие-то условные заранее, вы, очевидно, попадаете в ситуацию, когда онпоследовательное вычисление до true (или чего-либо, что приводит к выполнению рекурсивного вызова).


Помимо этого, похоже, что вы могли бы реструктурировать свой код, чтобы избежать этого.Что вы пытаетесь сделать с _toOpen?Почему вы, кажется, игнорируете переданный аргумент files (я ценю, что есть проверенный код, и предположительно содержимое копируется в _toOpen, но это, по меньшей мере, необычно).

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

1 голос
/ 18 августа 2011

Я думаю, что проблема в вашей логике и тесте для _toOpen.size() > 0.

После того, как вы выполните _toOpen.add(word);, тогда _toOpen.size() будет всегда больше 0 и, таким образом,условие if всегда истинно, и функция всегда будет повторяться.


Вы говорите: «Но _toOpen.add(word); срабатывает не всегда» - но его нужно запускать только один раз в жизненном цикле приложения, чтобы этот метод повторялся бесконечно.

Ваш Vector _toOpen равен static , что означает только одну его, что означает, что прикак только срабатывает _toOpen.add(word);, утверждение _toOpen.size() > 0 всегда остается верным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...