2010-03-29 5 views
15

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

+12

профилактика лучше, чем ловить .... –

+4

ловли полезно для отладки :) – JonnyBoy

ответ

22

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

public class Test { 

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

} 
+1

А я пытался с общим исключением. Благодаря! – stereos

+0

Я согласен, что выяснение того, что вызывает исключение и предотвращение этого, было бы лучше. – Thilo

+8

@stereos Вы не пытались поймать «Исключение», не так ли? 'Ошибка' расширяет' Throwable' напрямую, а не через 'Exception'. –

7

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

+0

В случае использования рекурсии и переполнения опций набора JVM SO является нормальным отрицательным ответом правильной программы. Мы ДОЛЖНЫ поймать его и отреагировать. Например, в случае ленивой последовательности, заданной рекурсивным сокращением (http://stackoverflow.com/a/33926444/715269), мы могли бы просто перейти на более мелкие шаги. – Gangnus

+1

Улавливание ошибки SO также полезно для отладки, когда вы не знаете, какой из многих рекурсивных методов вызывает ошибку SO :) –

0

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

+0

Где спрашивающий говорит, что он хочет проглотить? Напротив, он хочет «наказывать цену» – Gangnus

+0

Я понимаю, что OP хочет поймать StackOverflowException, чтобы предложить какую-то пользовательскую логику (наказывать) при обработке исключения. И мы вернемся к квадрату, который «Никто не должен ломать Ошибки». –

+0

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

4

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

2

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

1

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

public class TryExample { 

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

Ваше решение для того, что было ответило несколько лет назад надлежащим образом? Вы понимаете, что ловушка «Исключение» - это то, что ОП уже пытался и явно не сработало? – Tom