2010-03-29 4 views
15

Puoi provare/catturare un'eccezione di overflow dello stack in java? Sembra che si stia buttando in entrambi i modi. Quando le mie procedure si espandono, mi piacerebbe "penalizzare" quel valore.try/catch on stack overflow in java?

+12

prevenire è meglio che cattura .... –

+4

cattura è utile per il debug :) – JonnyBoy

risposta

22

sembra funzionare:

public class Test { 

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

} 
+1

Ah stavo provando con un'eccezione generica. Grazie! – stereos

+0

Sono d'accordo sul fatto che scoprire cosa sta causando l'eccezione e prevenirlo sarebbe comunque meglio. – Thilo

+8

@stereos Non stavi cercando di catturare "Eccezione", vero? 'Errore' estende' Throwable' direttamente, non tramite 'Exception'. –

7

Se hai trovato un overflow dello stack, è probabile che tentando ricorsione infinita o si è notevolmente abusando invocazioni di funzione. Forse potresti considerare di rendere alcune delle tue procedure iterative anziché ricorsive o ricontrollare che hai un caso base corretto nella tua procedura ricorsiva. Catturare un'eccezione di overflow dello stack è una cattiva idea; stai trattando i sintomi senza affrontare la causa sottostante.

+0

Nel caso dell'uso della ricorsione e dell'overflow delle opzioni impostate della JVM, la SO è una normale risposta negativa di un programma corretto. Dobbiamo prenderlo e reagire. Ad esempio, nel caso della sequenza lazy, impostata da una funzione ricorsiva (http://stackoverflow.com/a/33926444/715269), potremmo semplicemente procedere con passi più piccoli. – Gangnus

+1

L'errore SO è utile anche per il debug quando non si conosce quale dei molti metodi ricorsivi causi l'errore SO :) –

0

Sono d'accordo con Michael - StackOverflowException è un segnale che qualcosa è andato storto. Ingerire non è una buona idea. La migliore linea d'azione è quella di correggere la causa principale di questo errore.

+0

Dove l'interrogante dice che vuole ingoiare? Al contrario, si sforza di "penalizzare il valore" – Gangnus

+0

La mia comprensione è che l'OP vuole catturare StackOverflowException per offrire qualche logica personalizzata (penalizza) durante l'elaborazione dell'eccezione. E, siamo tornati al punto di partenza uno che è "Uno non catturerà errori". –

+0

E sto ripetendo ancora: Nel caso dell'uso della ricorsione, SO assume un significato assolutamente diverso: tu sei saltato troppo in profondità, ripetilo dividendolo in passi più bassi. – Gangnus

4

si deve prendere un errore, non l'eccezione

2

Le caratteristiche funzionali del Java 8 rende questa domanda incomparabilmente più importante. Perché mentre iniziamo a usare la ricorsione in modo massiccio, StackOverflowException è qualcosa su cui dobbiamo contare.

I tipi di lambda Java 8 non hanno nessuno tra quelli che lancia StackOverflowException. Quindi, dobbiamo creare tale. È assolutamente necessario, senza di ciò non passeremo neanche il controllo IDE.

Per esempio, Integer -> Intero tipo di funzione potrebbe apparire come:

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

Dopo di che possiamo scrivere una funzione che accetta lambda gettando StackOverflowException.

public T get(int currentIndex) throws StackOverflowException{ 

E solo ora siamo in grado di creare un lambda ricorsiva:

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

Dopo di che possiamo chiamare la catena ricorsiva fiboSequence.get(i) e ottenere un risultato o uno StackOverflowException se tutta la catena era incomputable.

In caso di utilizzo della ricorsione, SO assume un significato assolutamente diverso: si è saltato troppo in profondità, ripetendolo dividendolo in passaggi più bassi.

1

Ecco la mia soluzione,

public class TryExample { 

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

La tua soluzione per qualcosa a cui è stata data risposta diversi anni fa in modo corretto? Ti rendi conto che catturare l'eccezione è ciò che l'OP ha già provato e ovviamente non ha funzionato? – Tom