Differenze tra Eccezione e Errore
Domanda
Sto cercando di imparare di più su base Java e i diversi tipi di Throwables, qualcuno può farmi sapere le differenze tra le Eccezioni ed Errori?
Soluzione
Errori non dovrebbe essere catturato o trattati (tranne in rari casi).Le eccezioni sono il pane e il burro di gestione delle eccezioni.Il Javadoc lo spiega bene:
Un Errore è una sottoclasse di Throwable che indica problemi gravi che un ragionevole applicazione non dovrebbe provare a prendere.La maggior parte di questi errori sono anormale condizioni.
Un'occhiata ad alcune delle sottoclassi di Error
, prendendo alcuni dei loro commenti JavaDoc:
AnnotationFormatError
- Generata quando l'annotazione parser tenta di leggere un'annotazione da un file di classe e determina che l'annotazione non è valido.AssertionError
- Gettato per indicare che un'asserzione non riuscita.LinkageError
- Sottoclassi di LinkageError indicare che una classe ha una certa dipendenza di un'altra classe;tuttavia, l'ultima della classe ha incompatibly cambiato dopo la compilazione della ex classe.VirtualMachineError
- Gettato per indicare che la Macchina Virtuale Java è rotto o ha esaurito le risorse necessarie per continuare ad operare.
Ci sono in realtà tre grandi sottocategorie di Throwable
:
Error
- Qualcosa di abbastanza grave è andato storto la maggior parte delle applicazioni in crash, piuttosto che cercare di gestire il problema,- Unchecked Exception (aka
RuntimeException
- Molto spesso un errore di programmazione come unNullPointerException
o illegali argomento.Le applicazioni possono, a volte, di gestire o di recuperare questoThrowable
categoria -- o almeno prendere al Threadrun()
metodo, il registro di denuncia, e continuare a correre. - Eccezione controllata (aka Tutto il resto) - le Applicazioni devono essere in grado di catturare e significativamente fare qualcosa con il resto, come
FileNotFoundException
eTimeoutException
...
Altri suggerimenti
diapositiva che mostra di Java eccezione gerarchia da @ Georgios-gousios spiega sinteticamente le differenze tra errori ed eccezioni in Java.
Gli errori tendono a segnalare la fine della vostra applicazione come lo conoscete. E 'in genere non può essere recuperato da e dovrebbe causare il VM per uscire. Afferrare loro non dovrebbe essere fatto salvo per il login o, eventualmente, di visualizzazione e di messaggio appropriato prima di uscire.
Esempio: OutOfMemoryError -. Non molto si può fare come il vostro programma non può più eseguire
Le eccezioni sono spesso recuperabili e anche quando non è, in genere significa solo un tentativo di operazione non è riuscita, ma il programma può ancora portare avanti.
Esempio: IllegalArgumentException -. Passato dati non validi a un metodo in modo che il metodo di chiamata non è riuscita, ma non influenza le operazioni future
Questi sono esempi semplicistici, e non v'è un altro grande quantità di informazioni sui soli pochi eccezioni.
Un errore è una sottoclasse di Throwable che indica gravi problemi che una applicazione ragionevole non dovrebbe provare per la cattura.
errori -
-
Error
s in java sono di tipojava.lang.Error
. - Tutti gli errori in Java sono di tipo incontrollato.
-
Error
s avvengono in fase di esecuzione. Essi non saranno resi noti al compilatore. - E 'impossibile correggere gli errori.
-
Error
s sono per lo più causati da l'ambiente in cui applicazione è in esecuzione. - Esempi:
java.lang.StackOverflowError
,java.lang.OutOfMemoryError
-
Exception
s in Java sono di tipojava.lang.Exception
. -
Exception
s comprendono sia controllato così come il tipo incontrollato. - Eccezioni controllate sono noti a compilatore dove come eccezioni unchecked non sono noti a compilatore perché si verificano in fase di esecuzione.
- È possibile recuperare da eccezioni da loro manipolazione attraverso i blocchi
try-catch
. -
Exception
s sono principalmente causato dalla applicazione stessa. - Esempi: eccezioni controllate:
SQLException
,IOException
Eccezioni unchecked:ArrayIndexOutOfBoundException
,ClassCastException
,NullPointerException
Per ulteriori approfondimenti: http://javaconceptoftheday.com/difference- tra-error-vs-eccezioni-in-java /
La descrizione della classe Error
è abbastanza chiaro:
Un
Error
è una sottoclasse diThrowable
che indica gravi problemi che una applicazione ragionevole non dovrebbe provare catturare. La maggior parte di tali errori sono condizioni anomale. ilThreadDeath
errore, anche se una condizione "normale", è anche una sottoclasse diError
perché la maggior parte le applicazioni non dovrebbero cercare di catturare esso.Un metodo non è tenuto a dichiarare in la sua clausola throws eventuali sottoclassi
Error
che potrebbero essere gettato durante la esecuzione del metodo, ma non catturati, dal momento che questi errori sono condizioni anomale che non dovrebbe mai verificarsi.
In breve, non si dovrebbe prendere Error
s, tranne avete una buona ragione per farlo. (Ad esempio per evitare che la realizzazione di web server in crash se un servlet esaurisce la memoria o qualcosa del genere).
Un Exception
, d'altra parte, è solo un'eccezione normale come in qualsiasi altra lingua moderna. Troverete una descrizione dettagliata nella documentazione delle API Java o qualsiasi risorsa online o offline.
Ci sono diversi somiglianze e le differenze tra le classi java.lang.Exception
e java.lang.Error
.
Somiglianze:
-
In primo luogo - entrambe le classi si estende
java.lang.Throwable
e di conseguenza eredita molti dei metodi che sono comuni da utilizzare quando si tratta con errori come:getMessage
,getStackTrace
,printStackTrace
e così via. -
In secondo luogo, come sottoclassi di
java.lang.Throwable
entrambi ereditano le seguenti proprietà:-
Throwable se stessa e alle sue sottoclassi (compresi
java.lang.Error
) può essere dichiarato in lista metodo eccezioni usandothrows
parola chiave. Tale dichiarazione richiesta solo perjava.lang.Exception
e sottoclassi, perjava.lang.Throwable
,java.lang.Error
ejava.lang.RuntimeException
e le loro sottoclassi è facoltativo. -
Solo
java.lang.Throwable
e sottoclassi permesso l'utilizzo nella clausolacatch
. -
Solo
java.lang.Throwable
e sottoclassi possono essere utilizzati con parola chiave -.throw
-
La conclusione di questa struttura segue sia java.lang.Error
e java.lang.Exception
possono essere dichiarate nell'intestazione del metodo, può essere nella clausola catch
, può essere utilizzato con throw
parola.
Differenze:
-
In primo luogo - concettuale differenza:
java.lang.Error
progettato per essere gettato dalla JVM e indicare i gravi problemi e destinato a fermarsi esecuzione del programma invece di essere catturato (ma è possibile che per qualsiasi altro successorejava.lang.Throwable
).Un passaggio da javadoc Descrizione su
java.lang.Error
:... indica gravi problemi che una richiesta ragionevole dovrebbe Non cercare di catturare.
In
java.lang.Exception
opposta progettato per rappresentare gli errori che previsto e può essere gestito da un programmatore senza terminazione l'esecuzione del programma.Un passaggio da javadoc Descrizione su
java.lang.Exception
:... indica condizioni che un'applicazione ragionevole potrebbe voler cattura.
- La seconda differenza tra
java.lang.Error
ejava.lang.Exception
quella prima considerata un incontrollato eccezione per il controllo eccezione compilazione. Come il codice risultato gettandojava.lang.Error
o delle sue sottoclassi non richiedono di dichiarare questo errore nell'intestazione metodo. Mentre gettandojava.lang.Exception
dichiarazione richiesta nell'intestazione metodo.
diagramma Throwable e la classe successore (proprietà e metodi sono omessi).
IMO un errore è qualcosa che può causare l'applicazione di fallire e non deve essere maneggiato. Un'eccezione è qualcosa che può causare risultati imprevedibili, ma può essere recuperato da.
Esempio:
Se un programma ha esaurito la memoria è un errore come l'applicazione non può continuare. Tuttavia, se un programma accetta un tipo di input non corretto è un'eccezione come il programma può gestire e reindirizzare a ricevere il tipo di ingresso corretto.
Ecco una buona sintesi di API Java quello che un errore e di eccezione rappresenta:
Un errore è una sottoclasse di Throwable che indica gravi problemi che un'applicazione ragionevole non dovrebbe cercare di catturare. La maggior parte di tali errori sono condizioni anomale. L'errore ThreadDeath, anche se una condizione "normale", è anche una sottoclasse di errore perché la maggior parte delle applicazioni non dovrebbero cercare di catturarlo.
Un metodo non è tenuto a dichiarare in la sua clausola throws eventuali sottoclassi Errore che potrebbe essere gettato durante la esecuzione del metodo, ma non catturati, dal momento che questi errori sono condizioni anomale che non dovrebbe mai verificarsi.
OTOH, per le eccezioni, Java API dice:
L'eccezione di classe e le sue sottoclassi sono una forma di Throwable che indica le condizioni in cui una domanda ragionevole potrebbe voler prendere.
Gli errori sono principalmente causati dall'ambiente in cui applicazione è in esecuzione. Ad esempio, si verifica quando OutOfMemoryError JVM esaurisce la memoria o StackOverflowError si verifica quando overflow dello stack.
Eccezioni sono principalmente causati dall'applicazione stessa. Ad esempio, NullPointerException si verifica quando un'applicazione tenta di accedere oggetto nullo o ClassCastException si verifica quando un'applicazione tenta di lanciare tipi di classe incompatibili.