Как поймать и восстановить переполнение стека в 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 а затем перенаправление потока ошибок для проверки переполнения стека.