Try/catch при переполнении стека в java?

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

Ответы

Ответ 1

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

public class Test {

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

}

Ответ 2

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

Ответ 3

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

Ответ 4

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

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

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

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

После этого мы можем написать функцию, которая будет принимать lambdas, бросая 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 получает совсем другое значение: вы перепрыгнули слишком глубоко, повторите его разделение на более мелкие шаги.

Ответ 5

Вот мое решение,

public class TryExample {

    public static void main(String[] args){
        try {
            int no=10/0;
        } catch (Exception e) {
            System.err.println("Arithmetic Exception occurs!");
        }
    }
}

Ответ 6

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