2010-03-29 18 views
15

¿Puedes intentar/atrapar una excepción de desbordamiento de pila en java? Parece lanzarse de cualquier manera. Cuando mis procedimientos se desborden, me gustaría "penalizar" ese valor.try/catch on stack overflows in java?

+12

es mejor que la captura .... –

+4

captura es útil para la depuración :) Ah – JonnyBoy

Respuesta

22

parece funcionar:

public class Test { 

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

} 
+1

que estaba tratando con una excepción genérica. ¡Gracias! – stereos

+0

Estoy de acuerdo en que averiguar qué está causando la excepción y prevenirla sería mejor. – Thilo

+8

@stereos No estabas tratando de atrapar 'Exception' ¿eras? 'Error' extiende' Throwable' directamente, no a través de 'Exception'. –

7

Si usted está recibiendo un desbordamiento de pila, es probable que esté intentando recursividad infinita o está abusando gravemente invocaciones de funciones. Tal vez considere la posibilidad de que algunos de sus procedimientos sean iterativos en lugar de recursivos o verifique que tenga un caso base correcto en su procedimiento recursivo. Capturar una excepción de desbordamiento de pila es una mala idea; está tratando los síntomas sin abordar la causa subyacente.

+0

En el caso del uso de recursión y desbordamiento de las opciones establecidas de la JVM, el SO es una respuesta negativa normal de un programa correcto. DEBEMOS atraparlo y reaccionar. Por ejemplo, en el caso de la secuencia diferida, establecida por una terminación recursiva (http://stackoverflow.com/a/33926444/715269), podríamos simplemente seguir pasos más pequeños. – Gangnus

+1

La captura del error SO también es útil para la depuración cuando no se sabe cuál de los muchos métodos recursivos está causando el error SO :) –

0

Estoy de acuerdo con Michael - StackOverflowException es una señal de que algo salió muy mal. Tragarlo no es una buena idea. El mejor curso de acción es corregir la causa raíz de este error.

+0

¿Dónde el interlocutor dice que quiere tragar? Por el contrario, se niega a "penalizar el valor" – Gangnus

+0

Según tengo entendido, el OP desea capturar StackOverflowException para ofrecer alguna lógica personalizada (penalizar) al procesar la excepción. Y, volvemos al punto uno que es "Uno no debe atrapar errores". –

+0

Y nuevamente estoy repitiendo: en el caso del uso de recursividad, SO tiene un significado completamente diferente: has saltado demasiado profundo, repítelo dividiéndolo en pasos más superficiales. – Gangnus

4

tienes que coger un error, no la excepción

2

Las características funcionales de Java 8 hace esta pregunta incomparablemente más importante. Mientras comenzamos a utilizar la recursión masivamente, debemos contar con StackOverflowException.

Los tipos Java 8 lambdas no tienen ninguno entre ellos que arroje StackOverflowException. Entonces, tenemos que crear tal. Es absolutamente necesario, sin eso no pasaremos ni siquiera el control IDE.

Por ejemplo, Integer -> Entero tipo de función podría parecer como:

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

Después de que podemos escribir una función que acepte lambdas tirar StackOverflowException.

public T get(int currentIndex) throws StackOverflowException{ 

Y sólo ahora podemos crear una lambda recursiva:

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

Después de que podemos llamar la cadena recursiva fiboSequence.get(i) y obtener un resultado o una StackOverflowException si toda la cadena era incomputable.

En el caso del uso de recursividad, SO tiene un significado completamente diferente: ha saltado demasiado profundo, repítalo dividiéndolo en pasos más superficiales.

1

Aquí está mi solución,

prevención
public class TryExample { 

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

¿Su solución para algo que se ha respondido hace varios años de forma adecuada? ¿Te das cuenta de que atrapar 'Excepción' es lo que OP ya probó y obviamente no funcionó? – Tom