Установить максимальную глубину рекурсии в Java - PullRequest
0 голосов
/ 11 декабря 2018

Я знаю, что на этот вопрос уже отвечали с помощью многочисленных методов:

  • Установить максимальный размер стека (-Xss20m)
  • вам нужна большая рекурсия, проблема в программе.

Эти методы великолепны, но я знаю в моем коде есть проблема, и я хочу специально ограничить (до небольшого числа, например 5) рекурсиюглубина, чтобы проверить, является ли это проблемой.
Есть ли такой метод, как sys.setrecursionlimit в python?

Ответы [ 2 ]

0 голосов
/ 15 декабря 2018

Создайте этот класс:

public class RecursionLimiter {
    public static int maxLevel = 10;

    public static void emerge() {
        if (maxLevel == 0)
            return;
        try {
            throw new IllegalStateException("Too deep, emerging");
        } catch (IllegalStateException e) {
            if (e.getStackTrace().length > maxLevel + 1)
                throw e;
        }
    }
}

Затем импортируйте static и вставьте вызов emerge() в начало любого метода в вашем коде, который может быть глубоко рекурсивным.Вы можете настроить максимально допустимый уровень рекурсии с помощью переменной maxLevel.Процедура emerge() прервет выполнение на уровне, превышающем значение этой переменной.Вы можете отключить это поведение, установив maxLevel в 0.Это решение является поточно-ориентированным, поскольку вообще не использует счетчик.

0 голосов
/ 11 декабря 2018

Наименее инвазивный «ручной» способ сделать это (также самый хакерский) - это, вероятно, создать статическую переменную в вашем классе, которая имеет проблему с рекурсией.Когда вы вводите рекурсивный метод, используйте его для подсчета глубины рекурсии (путем сложения или вычитания), а когда вы выходите, поменяйте местами то, что вы сделали при входе.

Это не здорово, но это намного лучше, чем пытатьсяустановить глубину стека (почти любой системный вызов в java будет проходить через 5 уровней стека, даже не мигая).

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

В качестве альтернативы я предлагаю, чтобы вы допустили сбой "нормально" и бросили исключение, а затем некоторое время медитировали на трассировке стека - онидействительно информативным и, вероятно, приведет вас к источнику вашей проблемы быстрее, чем что-либо еще.

static int maxDepth = 5;
public void recursiveMethod() {
    if(maxDepth-- == 0)
        throw new IllegalStateException("Stack Overflow");
    recursiveMethod();
    maxDepth++;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...