Ваш стек очень многословен, говоря вам две вещи:
- У вас фактически есть переполнение стека, которое не вызвано забытым приращением индекса или чем-то подобным.
- Код (на первый взгляд) не попадает в бесконечный цикл, потому что кадры стека оканчиваются на разных строках кода. Если бы это было иначе, у вас был бы бесконечный цикл. Он все еще может быть один (скрытый кажущейся случайностью), но гораздо менее вероятен.
В настоящее время всякий раз, когда вы выполняете рекурсивный вызов (вызов generate
в функции generate), вы увеличиваете размер стека. Вы передаете все текущие состояния поля в кадр стека, и виртуальная машина должна помнить об этом, продолжая следующий нижний вызов generate
. Поскольку это, вероятно, также вызовет саму себя и т. Д., В какой-то момент стек становится слишком большим для хранения в стеке.
У вас есть два варианта, на мой взгляд. Либо увеличьте максимальный размер стека при запуске виртуальной машины
set JAVA_OPTS=%JAVA_OPTS% -Xms1024m -Xmx1024m
или (лучший вариант) переработать ваш код, чтобы он был итеративным Таким образом, вы не увеличиваете свой стек до бесконечности. Что бы это значило:
Вместо того, чтобы работать повторно (делать вызовы самого метода), вам придется создавать циклы, которые будут обращаться к различным уровням стека с помощью явного проектирования. Весь рекурсивный код (в теории ИТ) может быть преобразован в итеративный код, поэтому это должно быть возможно. Однако вы должны думать иначе.