J'essaie d'en apprendre plus sur la base Java et les différents types de Throwables, quelqu'un peut-il me faire savoir les différences entre les exceptions et les erreurs?
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 tenter de résoudre. La plupart de ces erreurs sont des conditions anormales.
Regardez quelques-unes des sous-classes de Error
, en prenant quelques-uns de leurs commentaires JavaDoc:
AnnotationFormatError
- Lancé lorsque l'analyseur d'annotations tente de lire une annotation à partir d'un fichier de classe et détermine que l'annotation est mal formée.AssertionError
- Lancé pour indiquer qu'une assertion a échoué.LinkageError
- Les sous-classes de LinkageError indiquent qu'une classe a une dépendance à une autre classe; cependant, la dernière classe a changé de façon incompatible après la compilation de la première classe.VirtualMachineError
- Lancé pour indiquer que la machine virtuelle Java) est en panne ou n'a plus les ressources nécessaires pour continuer à fonctionner.Il y a vraiment trois sous-catégories importantes de Throwable
:
Error
- Quelque chose d'assez grave a mal tourné, la plupart des applications devraient planter au lieu d'essayer de gérer le problème,RuntimeException
) - Très souvent, une erreur de programmation telle que NullPointerException
ou un argument illégal. Les applications peuvent parfois gérer ou récupérer cette catégorie Throwable
- ou du moins l’intercepter à la méthode run()
du thread, consigner la plainte et poursuivre son exécution.FileNotFoundException
et TimeoutException
...Ceci 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 tendent à signaler la fin de votre application telle que vous la connaissez. En règle générale, il ne peut pas être récupéré et doit entraîner la fermeture de votre VM. Les récupérer ne doit pas être fait, sauf pour éventuellement vous connecter ou afficher et un message approprié avant de quitter.
Exemple: OutOfMemoryError - Vous ne pouvez pas faire grand-chose car votre programme ne peut plus être exécuté.
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 que votre programme peut continuer.
Exemple: IllegalArgumentException - Transmettre des données non valides à une méthode afin que l'appel de méthode échoue, mais n'affecte pas les opérations futures.
Ce sont des exemples simplistes, et il existe une autre mine d'informations sur les seules exceptions.
Soleil le met mieux :
Une erreur est une sous-classe de Throwable qui indique des problèmes graves qu’une application raisonnable ne devrait pas tenter de résoudre.
Errors -
Error
s in 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
s sont principalement causés par l'environnement dans lequel l'application est en cours d'exécution.Java.lang.StackOverflowError
, Java.lang.OutOfMemoryError
Exception
s in Java sont de type Java.lang.Exception
.Exception
s inclut à la fois les types cochés et non cochés.try-catch
blocs.Exception
s sont principalement causés par l'application elle-même.SQLException
, IOException
ArrayIndexOutOfBoundException
, ClassCastException
, NullPointerException
lectures supplémentaires: http://javaconceptoftheday.com/difference-between-error-vs-exception-in-Java/
La description de la classe Error
est assez claire:
Un
Error
est une sous-classe deThrowable
qui indique de graves problèmes qu'une application raisonnable ne devrait pas essayer de résoudre. La plupart de ces erreurs sont des conditions anormales. L'erreurThreadDeath
, bien qu'une condition "normale", est également une sous-classe deError
car la plupart des applications ne devraient pas tenter de l'attraper.Une méthode n'est pas obligée de déclarer dans sa clause throws les sous-classes de
Error
susceptibles d'être émises lors de l'exécution de la méthode mais non interceptées, car ces erreurs sont des conditions anormales qui ne devraient jamais se produire.
Cité de Java documentation de la classe Error
.
En bref, vous ne devriez pas attraper Error
s, sauf que vous avez une bonne raison de le faire. (Par exemple, pour éviter que votre implémentation de serveur Web ne plante, si un servlet manque de mémoire ou quelque chose comme ça.)
Un Exception
, en revanche, n'est qu'une exception normale, comme dans tout autre langage 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:
Premièrement - les deux classes sont étendues Java.lang.Throwable
et hérite donc de nombreuses méthodes couramment utilisées pour traiter des erreurs telles que: getMessage
, getStackTrace
, printStackTrace
, etc.
Deuxièmement, en tant que sous-classes de Java.lang.Throwable
_ ils héritent tous les deux des propriétés suivantes:
Throwable lui-même et l’une de ses sous-classes (y compris Java.lang.Error
) peuvent être déclarés dans la liste des exceptions de méthodes à l’aide de throws
mot-clé. Cette déclaration n'est requise que pour Java.lang.Exception
et sous-classes, pour Java.lang.Throwable
, Java.lang.Error
et Java.lang.RuntimeException
et leurs sous-classes, il est facultatif.
Seulement Java.lang.Throwable
et les sous-classes autorisées à être utilisées dans la clause catch
.
Seulement Java.lang.Throwable
et les sous-classes peuvent être utilisés 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é dans l'en-tête de la méthode, peut être dans la clause catch
, peut être utilisé avec le mot clé throw
.
Différences:
Première - différence conceptuelle: Java.lang.Error
conçu pour être lancé par la machine virtuelle Java et indiquer des problèmes graves et destiné à arrêter l'exécution du programme au lieu d'être intercepté (mais cela est possible comme pour tout autre Java.lang.Throwable
successeur).
Un passage de javadoc description de Java.lang.Error
:
... indique des problèmes graves qu’une application raisonnable ne devrait pas tenter de résoudre.
Au contraire de Java.lang.Exception
conçu pour représenter les erreurs attendues et pouvant être traité par un programmeur sans mettre fin à l'exécution du programme.
Un passage de javadoc description de Java.lang.Exception
:
... indique les conditions qu'une application raisonnable pourrait vouloir intercepter.
Java.lang.Error
et Java.lang.Exception
qui a été considéré pour la première fois comme une exception non contrôlée pour la vérification des exceptions à la compilation. En tant que code de résultat jetant Java.lang.Error
ou ses sous-classes ne nécessitent pas de déclarer cette erreur dans l’en-tête de la méthode. En jetant Java.lang.Exception
déclaration requise dans l'en-tête de la méthode.Throwable et son diagramme de classe successeur (les propriétés et les méthodes sont omises).
OMI une erreur est quelque chose qui peut provoquer l'échec de votre application et ne doit pas être traitée. Une exception est quelque chose qui peut provoquer des résultats imprévisibles, mais peut être récupéré.
Exemple:
Si un programme manque de mémoire, c'est une erreur, car l'application ne peut pas continuer. Toutefois, si un programme accepte un type d'entrée incorrect, il s'agit d'une exception, car il 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 est en cours d'exécution. Par exemple, OutOfMemoryError se produit lorsque la 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 null ou ClassCastException se produit lorsqu'une application tente de transtyper des types de classe incompatibles.
Voici un assez bon résumé de l'API Java que représente 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 tenter de résoudre. La plupart de ces erreurs sont des conditions anormales. L’erreur ThreadDeath, bien qu’elle soit une condition "normale", est également une sous-classe de Error car la plupart des applications ne doivent pas essayer de l’attraper.
Une méthode n'est pas obligée de déclarer dans sa clause throws les sous-classes d'erreur susceptibles d'être émises lors de 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 Exceptions, Java API dit:
La classe Exception et ses sous-classes sont une forme de Throwable qui indique les conditions qu'une application raisonnable peut vouloir intercepter.