Как я могу поймать и восстановить после переполнения стека в Java? - PullRequest
9 голосов
/ 16 февраля 2012

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

Ответы [ 3 ]

14 голосов
/ 16 февраля 2012

При вызове методов ваших учеников вы должны встроить вызовы в блоки try-catch и поймать Exception s как 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 с - который заставляет вас использовать try-catch или throws (например, IOException)
  • RuntimeException с - который всплывает с помощью методов (например, NullPointerException))
  • Error с - например.StackOverflowError

См. официальные документы Java для Throwable объекта

2 голосов
/ 16 февраля 2012

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

1 голос
/ 16 февраля 2012

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

...