Можете ли вы попробовать/поймать исключение переполнения стека в java? Кажется, он бросает себя в любом случае. Когда мои процедуры переполняются, я хотел бы «наказывать» это значение.try/catch при переполнении стека в java?
ответ
Кажется, работает:
public class Test {
public static void main(String[] argv){
try{
main(null);
}
catch(StackOverflowError e){
System.err.println("ouch!");
}
}
}
Если вы получаете переполнение стека, вы, вероятно, пытается зацикливание или сильно злоупотребляя вызовы функций. Возможно, вы можете подумать о том, чтобы сделать некоторые из ваших процедур итеративными, а не рекурсивными или дважды проверять, что у вас есть правильный базовый случай в вашей рекурсивной процедуре. Захват исключения переполнения стека - плохая идея; вы лечите симптомы, не обращаясь к основной причине.
В случае использования рекурсии и переполнения опций набора JVM SO является нормальным отрицательным ответом правильной программы. Мы ДОЛЖНЫ поймать его и отреагировать. Например, в случае ленивой последовательности, заданной рекурсивным сокращением (http://stackoverflow.com/a/33926444/715269), мы могли бы просто перейти на более мелкие шаги. – Gangnus
Улавливание ошибки SO также полезно для отладки, когда вы не знаете, какой из многих рекурсивных методов вызывает ошибку SO :) –
Я согласен с Michael - StackOverflowException - сигнал о том, что что-то пошло не так. Проглатывание это не очень хорошая идея. Лучшим направлением действий является устранение основной причины этой ошибки.
Где спрашивающий говорит, что он хочет проглотить? Напротив, он хочет «наказывать цену» – Gangnus
Я понимаю, что OP хочет поймать StackOverflowException, чтобы предложить какую-то пользовательскую логику (наказывать) при обработке исключения. И мы вернемся к квадрату, который «Никто не должен ломать Ошибки». –
И снова повторяю: в случае использования рекурсии SO получает совершенно другое значение: вы перепрыгнули слишком глубоко, повторите его разделение на более мелкие ступени. – Gangnus
Вы должны поймать ошибку, не исключение
Функциональные особенности 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 получает совершенно иное значение: вы перепрыгнули слишком глубоко, повторите его разделение на более мелкие ступени.
Вот мое решение,
public class TryExample {
public static void main(String[] args){
try {
int no=10/0;
} catch (Exception e) {
System.err.println("Arithmetic Exception occurs!");
}
}
}
Ваше решение для того, что было ответило несколько лет назад надлежащим образом? Вы понимаете, что ловушка «Исключение» - это то, что ОП уже пытался и явно не сработало? – Tom
профилактика лучше, чем ловить .... –
ловли полезно для отладки :) – JonnyBoy