Как поймать и восстановить переполнение стека в 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(); } }
Подробнее
при ловле Throwable
s вы поймаете:
- нормальный
Exception
s-которые заставляют вас использоватьtry-catch
илиthrows
(напр.IOException
) -
RuntimeException
s-которые пузырь вверх через методы (например.NullPointerException
) -
Error
s-например.StackOverflowError
посмотреть официальные документы Java на Throwable
объект
вы можете запустить свои программы, используя новый Process
а затем перенаправление потока ошибок для проверки переполнения стека.