J'essaie d'en savoir plus sur Java de base et les différents types de Throwables, quelqu'un peut-il me faire savoir les différences entre les exceptions et les erreurs?
J'essaie d'en savoir plus sur Java de base et les différents types de Throwables, quelqu'un peut-il me faire savoir les différences entre les exceptions et les erreurs?
Réponses:
Les erreurs ne doivent pas être détectées ou traitées (sauf dans les cas les plus rares). Les exceptions sont le pain et le beurre de la gestion des exceptions. Le Javadoc l' explique bien:
Une erreur est une sous-classe de Throwable qui indique des problèmes graves qu'une application raisonnable ne devrait pas essayer d'attraper. La plupart de ces erreurs sont des conditions anormales.
Regardez quelques-unes des sous-classes de Error
, en prenant certains de leurs commentaires JavaDoc:
AnnotationFormatError
- Lancé lorsque l'analyseur d'annotation tente de lire une annotation à partir d'un fichier de classe et détermine que l'annotation est malformée.AssertionError
- Lancé pour indiquer qu'une assertion a échoué.LinkageError
- Les sous-classes de LinkageError indiquent qu'une classe a une certaine dépendance à une autre classe; cependant, la dernière classe a changé de manière incompatiblable après la compilation de la première classe.VirtualMachineError
- Lancé pour indiquer que la machine virtuelle Java est cassée ou n'a plus les ressources nécessaires pour continuer à fonctionner. Il existe en réalité trois sous-catégories importantes de Throwable
:
Error
- Quelque chose d'assez grave a mal tourné la plupart des applications devraient planter plutôt que d'essayer de gérer le problème,RuntimeException
) - Très souvent une erreur de programmation telle qu'un NullPointerException
argument ou un argument illégal. Les applications peuvent parfois gérer ou récupérer de cette Throwable
catégorie - ou au moins l'attraper à la run()
méthode de Thread , enregistrer la plainte et continuer à fonctionner.FileNotFoundException
et TimeoutException
...Cette diapositive montrant la hiérarchie des exceptions de Java par @ georgios-gousios explique de manière concise les différences entre les erreurs et les exceptions en Java.
Les erreurs ont tendance à signaler la fin de votre application telle que vous la connaissez. Il ne peut généralement pas être récupéré et devrait entraîner la fermeture de votre machine virtuelle. Les attraper ne doit pas être fait sauf pour éventuellement enregistrer ou afficher un message approprié avant de quitter.
Exemple: OutOfMemoryError - Vous ne pouvez pas faire grand-chose car votre programme ne peut plus s'exécuter.
Les exceptions sont souvent récupérables et même lorsqu'elles ne le sont pas, elles signifient généralement qu'une tentative d'opération a échoué, mais votre programme peut toujours continuer.
Exemple: IllegalArgumentException - Des données non valides ont été transmises à une méthode afin que l'appel de méthode échoue, mais cela n'affecte pas les opérations futures.
Ce sont des exemples simplistes, et il existe une autre mine d'informations sur les seules exceptions.
Erreurs -
Error
Les s en java sont de type java.lang.Error
.Error
s se produisent au moment de l'exécution. Ils ne seront pas connus du compilateur. Error
Les s sont principalement causés par l'environnement dans lequel l'application s'exécute. java.lang.StackOverflowError
,java.lang.OutOfMemoryError
Exception
s en java sont de type java.lang.Exception
.Exception
s incluent à la fois le type coché et non coché.try-catch
blocs.Exception
s sont principalement causés par l'application elle-même.SQLException
, IOException
ArrayIndexOutOfBoundException
, ClassCastException
,NullPointerException
lecture supplémentaire: http://javaconceptoftheday.com/difference-between-error-vs-exception-in-java/
Sun le dit le mieux :
Une erreur est une sous-classe de Throwable qui indique des problèmes graves qu'une application raisonnable ne devrait pas essayer d'attraper.
La description de la Error
classe est assez claire:
An
Error
est une sous-classe deThrowable
qui indique des problèmes graves qu'une application raisonnable ne devrait pas essayer d'attraper. La plupart de ces erreurs sont des conditions anormales. L'ThreadDeath
erreur, bien qu'une condition "normale", est également une sous-classe deError
car la plupart des applications ne devraient pas essayer de l'attraper.Une méthode n'est pas obligée de déclarer dans sa clause throws des sous-classes de
Error
qui pourraient être levées pendant l'exécution de la méthode mais pas interceptées, car ces erreurs sont des conditions anormales qui ne devraient jamais se produire.
Cité à partir de la propre documentation Java de la classeError
.
En bref, vous ne devriez pas attraper Error
s, sauf que vous avez une bonne raison de le faire. (Par exemple, pour empêcher votre implémentation de serveur Web de planter si un servlet manque de mémoire ou quelque chose du genre.)
An Exception
, d'autre part, n'est qu'une exception normale comme dans n'importe quelle autre langue moderne. Vous trouverez une description détaillée dans la documentation de l'API Java ou dans toute ressource en ligne ou hors ligne.
Il existe plusieurs similitudes et différences entre les classes java.lang.Exception
et java.lang.Error
.
Similitudes:
Tout d' abord - les deux classes s'étend java.lang.Throwable
et par conséquent beaucoup hérite des méthodes qui sont communes à utiliser lors de la gestion d'erreurs telles que: getMessage
, getStackTrace
, printStackTrace
et ainsi de suite.
Deuxièmement, en tant que sous-classes, java.lang.Throwable
ils héritent tous les deux des propriétés suivantes:
Throwable lui-même et n'importe laquelle de ses sous-classes (y compris java.lang.Error
) peuvent être déclarées dans la liste des exceptions de méthode à l'aide du throws
mot clé. Une telle déclaration exigée que pour java.lang.Exception
et sous - classes, pour java.lang.Throwable
, java.lang.Error
et java.lang.RuntimeException
et leurs sous - classes est facultative.
Seules les java.lang.Throwable
sous-classes et les sous-classes peuvent être utilisées dans la catch
clause.
Seules les java.lang.Throwable
classes et les sous-classes peuvent être utilisées avec le mot-clé - throw
.
La conclusion de cette propriété suit les deux java.lang.Error
et java.lang.Exception
peut être déclarée dans l'en-tête de la méthode, peut être dans une catch
clause, peut être utilisée avec un mot-clé throw
.
Différences:
Première - différence conceptuelle: java.lang.Error
conçue pour être lancée par la JVM et indiquer des problèmes graves et destinée à arrêter l'exécution du programme au lieu d'être interceptée (mais c'est possible comme pour tout autre java.lang.Throwable
successeur).
Un passage de la description javadoc sur java.lang.Error
:
... indique des problèmes graves qu'une application raisonnable ne devrait pas essayer d'attraper.
En revanche, java.lang.Exception
conçu pour représenter les erreurs attendues et pouvant être gérées par un programmeur sans arrêter l'exécution du programme.
Un passage de la description javadoc sur java.lang.Exception
:
... indique les conditions qu'une application raisonnable pourrait vouloir attraper.
java.lang.Error
et java.lang.Exception
ce premier considéré comme une exception non vérifiée pour la vérification des exceptions à la compilation. Comme le code de résultat java.lang.Error
ou ses sous-classes n'ont pas besoin de déclarer cette erreur dans l'en-tête de la méthode. En lançant la java.lang.Exception
déclaration requise dans l'en-tête de la méthode.Throwable et son diagramme de classes successeur (les propriétés et les méthodes sont omises).
Une erreur IMO est quelque chose qui peut entraîner l'échec de votre application et ne doit pas être gérée. Une exception est quelque chose qui peut entraîner des résultats imprévisibles, mais qui peut être récupéré.
Exemple:
Si un programme manque de mémoire, il s'agit d'une erreur car l'application ne peut pas continuer. Cependant, si un programme accepte un type d'entrée incorrect, il s'agit d'une exception car le programme peut le gérer et le rediriger pour recevoir le type d'entrée correct.
Les erreurs sont principalement causées par l'environnement dans lequel l'application s'exécute. Par exemple, OutOfMemoryError se produit lorsque JVM manque de mémoire ou StackOverflowError se produit lorsque la pile déborde.
Les exceptions sont principalement causées par l'application elle-même. Par exemple, NullPointerException se produit lorsqu'une application tente d'accéder à un objet nul ou ClassCastException se produit lorsqu'une application tente de convertir des types de classe incompatibles.
Voici un assez bon résumé de l'API Java ce que représentent une erreur et une exception:
Une erreur est une sous-classe de Throwable qui indique des problèmes graves qu'une application raisonnable ne devrait pas essayer d'attraper. La plupart de ces erreurs sont des conditions anormales. L'erreur ThreadDeath, bien qu'une condition "normale", est également une sous-classe d'erreur car la plupart des applications ne devraient pas essayer de l'attraper.
Une méthode n'est pas obligée de déclarer dans sa clause throws des sous-classes d'erreur qui pourraient être levées pendant l'exécution de la méthode mais non interceptées, car ces erreurs sont des conditions anormales qui ne devraient jamais se produire.
OTOH, pour les exceptions, l'API Java dit:
La classe Exception et ses sous-classes sont une forme de Throwable qui indique des conditions qu'une application raisonnable pourrait vouloir intercepter.
Les erreurs sont causées par l'environnement dans lequel votre application ou programme s'exécute. La plupart du temps, vous risquez de ne pas en récupérer car cela met fin à votre application ou programme. Javadoc a conseillé de ne pas prendre la peine d'attraper de telles erreurs puisque l'environnement, par exemple, JVM, sur de telles erreurs, va de toute façon se fermer.
Exemples:
VirtualMachineError
- Lancé pour indiquer que la machine virtuelle Java est défectueuse ou n'a plus les ressources nécessaires à son fonctionnement.
OutOfMemoryError
se produit lorsque la JVM manque de mémoire ou
StackOverflowError
lorsque la pile se termine.
Les exceptions sont causées par votre application ou programme lui-même; peut-être en raison de votre propre erreur. La plupart du temps, vous pouvez en récupérer et votre application continuera à s'exécuter. Il est conseillé de détecter de telles erreurs pour éviter une interruption anormale de votre application ou programme et / ou pour pouvoir personnaliser le message d'exception afin que les utilisateurs voient un message bien formaté au lieu des messages d'exception laids par défaut dispersés partout.
Exemples:
NullPointerException
se produit lorsqu'une application tente d'accéder à un objet nul. ou Tentative d'accès à un tableau avec un index inexistant ou appel d'une fonction avec des données ou des paramètres incorrects.
Unchecked exceptions != RuntimeExceptions
;Unchecked exceptions = RuntimeExceptions + Errors
. Je sais que cela soulève la question: l' erreur est-elle une exception? , mais c'est ce qu'ils écrivent. Voici juste un de ces exemples: docs.oracle.com/javase/tutorial/essential/exceptions/… .