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?
risposta
sembra funzionare:
public class Test {
public static void main(String[] argv){
try{
main(null);
}
catch(StackOverflowError e){
System.err.println("ouch!");
}
}
}
Ah stavo provando con un'eccezione generica. Grazie! – stereos
Sono d'accordo sul fatto che scoprire cosa sta causando l'eccezione e prevenirlo sarebbe comunque meglio. – Thilo
@stereos Non stavi cercando di catturare "Eccezione", vero? 'Errore' estende' Throwable' direttamente, non tramite 'Exception'. –
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.
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
L'errore SO è utile anche per il debug quando non si conosce quale dei molti metodi ricorsivi causi l'errore SO :) –
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.
Dove l'interrogante dice che vuole ingoiare? Al contrario, si sforza di "penalizzare il valore" – Gangnus
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". –
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
si deve prendere un errore, non l'eccezione
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.
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!");
}
}
}
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
prevenire è meglio che cattura .... –
cattura è utile per il debug :) – JonnyBoy