Как поймать и восстановить переполнение стека в Java?

Я пишу программу оценки для задания, в котором студенты реализуют алгоритмы рекурсивной сортировки. Это означает, что несколько студентов, вероятно, превратятся в сломанный код, который вызывает переполнение стека. Я хотел бы каким-то образом поймать переполнения стека, которые происходят при вызове кода студентов, чтобы я мог вычесть из их оценки и продолжить другие тесты. К сожалению, переполнение стека, похоже, не проходит через стандартный путь других исключений - блоки try/catch, похоже, не помощь. Есть ли способ вернуть выполнение в мой код после переполнения стека? Я изучил использование потоков для этого, но, похоже, он просто не может использовать try/catch.

3 ответов


при вызове методов ваших студентов вы должны вставлять вызовы в блоки try-catch и catch Exceptionкак Throwables.

следующий код:

public class Test {
    /**
     * @param args
     */
    public static void main(String[] args) {
        try {
            soe();
        } catch (Throwable e) {
            System.out.println("Caught:" + e
                    + ", everything went better than expected.");
        }
    }
    /**
     * Method producing StackOverflowError
     */
    public static void soe() {
        soe();
    }
}

Подробнее

при ловле Throwables вы поймаете:

  • нормальный Exceptions-которые заставляют вас использовать try-catch или throws (напр. IOException)
  • RuntimeExceptions-которые пузырь вверх через методы (например. NullPointerException)
  • Errors-например. StackOverflowError

посмотреть официальные документы Java на Throwable объект


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


вы можете попробовать запустить каждую программу в отдельном jvm.