попробовать / поймать переполнения стека в Java? - PullRequest
19 голосов
/ 29 марта 2010

Можете ли вы попробовать / поймать исключение переполнения стека в Java? Кажется, что бросается в любую сторону. Когда мои процедуры переполняются, я бы хотел "оштрафовать" это значение.

Ответы [ 5 ]

28 голосов
/ 29 марта 2010

Кажется, работает:

public class Test {

    public static void main(String[] argv){
        try{
            main(null);
        }
        catch(StackOverflowError e){
            System.err.println("ouch!");
        }
    }

}
9 голосов
/ 29 марта 2010

Если вы получаете переполнение стека, вы, вероятно, пытаетесь выполнить бесконечную рекурсию или серьезно злоупотребляете вызовами функций. Возможно, вы захотите сделать некоторые из ваших процедур итеративными, а не рекурсивными или перепроверить, что у вас есть правильный базовый случай в вашей рекурсивной процедуре. Поймать исключение переполнения стека - плохая идея; Вы лечите симптомы, не обращаясь к основной причине.

4 голосов
/ 25 ноября 2015

Функциональные возможности Java 8 делают этот вопрос несравненно более важным. Хотя мы начинаем массово использовать рекурсию, StackOverflowException - это то, что мы ДОЛЖНЫ рассчитывать.

В лямбда-типах Java 8 нет ни одного из них, который генерирует исключение StackOverflowException. Итак, мы должны создать такой. Это абсолютно необходимо, без этого мы не пройдем даже IDE-контроль.

Например, Integer -> Integer тип функции может выглядеть так:

@FunctionalInterface
public interface SoFunction <U> {
    public U apply(Integer index) throws StackOverflowException;
}

После этого мы можем написать функцию, которая будет принимать лямбда-выражения, генерирующие исключение StackOverflowException.

public T get(int currentIndex) throws StackOverflowException{

И только теперь мы можем создать рекурсивную лямбду:

fiboSequence.setSequenceFunction(
            (i) ->
            fiboSequence.get(i-2).add(fiboSequence.get(i-1))
);

После этого мы можем вызвать рекурсивную цепочку fiboSequence.get(i) и получить результат или StackOverflowException, если вся цепочка была неисчислимой.

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

4 голосов
/ 29 марта 2010

Вы должны поймать ошибку, а не исключение

0 голосов
/ 29 марта 2010

Я согласен с Майклом - StackOverflowException является сигналом того, что что-то пошло не так. Глотать это не очень хорошая идея. Лучший способ действий - это устранить причину этой ошибки.

...