Ответ 1
Кажется, работает:
public class Test {
public static void main(String[] argv){
try{
main(null);
}
catch(StackOverflowError e){
System.err.println("ouch!");
}
}
}
Можете ли вы попробовать/уловить исключение в java? Кажется, он бросает себя в любом случае. Когда мои процедуры переполняются, я хотел бы "наказывать" это значение.
Кажется, работает:
public class Test {
public static void main(String[] argv){
try{
main(null);
}
catch(StackOverflowError e){
System.err.println("ouch!");
}
}
}
Если вы получаете переполнение стека, вы, вероятно, пытаетесь бесконечную рекурсию или серьезно злоупотребляете вызовами функций. Возможно, вы можете подумать о том, чтобы сделать некоторые из ваших процедур итеративными, а не рекурсивными или дважды проверять, что у вас есть правильный базовый случай в вашей рекурсивной процедуре. Захват исключения - плохая идея; вы лечите симптомы, не обращаясь к основной причине.
Вы должны поймать ошибку, а не исключение
Функциональные возможности 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 получает совсем другое значение: вы перепрыгнули слишком глубоко, повторите его разделение на более мелкие шаги.
Вот мое решение,
public class TryExample {
public static void main(String[] args){
try {
int no=10/0;
} catch (Exception e) {
System.err.println("Arithmetic Exception occurs!");
}
}
}
Я согласен с Майклом - StackOverflowException - сигнал, что что-то пошло не так. Проглатывание это не очень хорошая идея. Лучшим направлением действий является устранение основной причины этой ошибки.