2013-08-27 9 views
8

Solo curioso. In an answer su come catturare StackOverflowErrors qualcuno ha scritto: "Sicuramente ci sono situazioni in cui un overflow dello stack potrebbe lasciare un'applicazione incoerente proprio come un esaurimento della memoria". Cosa c'è di così speciale in StackOverflowErrors che minaccia di corrompere lo stato dell'applicazione più, ad esempio, di una NullPointerException lanciata in caso di Bug? Una cosa che posso pensare è che un StackOverflowError può verificarsi in luoghi dove normalmente non viene mai lanciata un'eccezione (o altro Throwable, per quella materia) (ad esempio un semplice getter), quindi il programma probabilmente non è preparato per questo. Ci sono più problemi diabolici?Qual è il danno nel catturare un StackOverflowError?

+1

Sto pensando che un SOE si verificherà di solito a causa di un errore di codifica piuttosto che di un errore di dati. Altri commenti dicono "Un errore di overflow dello stack di solito è un bug" ma di solito non è un NPE? –

+0

@ user2310289 Ci sono molti modi per cadere su un NPE, quindi molti potrebbero voler saltare alcuni test e fare affidamento sul sistema try/catch a volte. Ma sì, catturare un NPE dovrebbe essere anche raro. –

+1

nota che si tratta di un errore! non un'eccezione! –

risposta

10

Un errore di overflow dello stack non significa affatto che la memoria è esaurita e non rende nulla di incoerente di per sé.

Ma un errore di overflow dello stack di solito è un bug. Dovresti correggere il bug invece di catturare l'eccezione. Non usare il sistema di eccezione per nascondere i bug.

Anche quando si sa che c'è il rischio di uno stack troppo profondo (ad esempio l'esplorazione del grafico), ci sono modi migliori per controllarlo piuttosto che far esplodere lo stack.

Da the Javadoc of the Error superclass:

Un errore è una sottoclasse di Throwable che indica gravi problemi che un'applicazione ragionevole non dovrebbe cercare di recuperare. La maggior parte di tali errori sono condizioni anomale. L'errore ThreadDeath, sebbene sia una condizione "normale" , è anche una sottoclasse di Errore perché la maggior parte delle applicazioni non deve tentare di catturarla.

+0

La cosa divertente è ... in realtà non è possibile rilevare questo errore. La VM si arresta prima che tu possa fare qualsiasi cosa. –

+1

@PaulNikonowicz - In realtà, puoi prenderlo ... se la tua JVM è correttamente implementata. Hai solo bisogno di prenderlo abbastanza in basso che c'è abbastanza spazio per fare ciò che il gestore deve fare. –

+0

Anche se fosse davvero un OutOfMemoryError - perché ciò renderebbe qualsiasi cosa incoerente - più di qualsiasi altro bug risultante in un'eccezione potrebbe fare? BTW: In un'applicazione decente è necessario catturare tutto - compresi gli errori - da qualche parte al livello più alto dell'applicazione per evitare di presentare l'enduser con uno stacktrace e fare forse qualche registrazione degli errori e segnalazione degli errori. –

0

Un errore è un problema serio che non dovrebbe essere catturato dunque: anche non prendere la super classe (Throwable) se un metodo genera un errore non c'è bisogno di dichiarare una throws-clausola di

il comportamento di un'applicazione spesso non è prevedibile dopo un errore - errori indicano una condizione anomala

Quindi, se uno StackOverflowError è stato gettato, l'applicazione ha raggiunto il massimo della pila-luoghi per ora. Puoi ricontrollare la tua domanda per l'avvio, ad es. prima il netturbino.

+0

Grazie per la risposta. Non vedo proprio cosa c'entri il garbage collector. Ad ogni modo - la mia domanda era se il SOE potesse avere conseguenze peggiori di quelle che ho indicato nella domanda. –

Problemi correlati