web-dev-qa-db-fra.com

Différences entre exception et erreur

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?

156
Marco Leung

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,
  • Exception non contrôlée (aka 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.
  • Exception cochée (autrement dit tout le reste) - Les applications doivent être capables d’attraper et de faire quelque chose de significatif avec le reste, telles que FileNotFoundException et TimeoutException...
164
Eddie

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.

Java Exception Hierarchy

31
avandeursen

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.

17
Robin

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.

7
Powerlord

Errors -

  1. Errors in Java sont de type Java.lang.Error.
  2. Toutes les erreurs dans Java sont de type non vérifié).
  3. Errors se produisent au moment de l'exécution. Ils ne seront pas connus du compilateur.
  4. Il est impossible de récupérer des erreurs.
  5. Errors sont principalement causés par l'environnement dans lequel l'application est en cours d'exécution.
  6. Exemples: Java.lang.StackOverflowError, Java.lang.OutOfMemoryError

Exceptions -

  1. Exceptions in Java sont de type Java.lang.Exception.
  2. Exceptions inclut à la fois les types cochés et non cochés.
  3. Les exceptions cochées sont connues du compilateur alors que les exceptions non vérifiées ne le sont pas, car elles se produisent au moment de l'exécution.
  4. Vous pouvez récupérer des exceptions en les gérant via try-catch blocs.
  5. Exceptions sont principalement causés par l'application elle-même.
  6. Exemples: Exceptions vérifiées: SQLException, IOException
    Exceptions non vérifiées: ArrayIndexOutOfBoundException, ClassCastException, NullPointerException

lectures supplémentaires: http://javaconceptoftheday.com/difference-between-error-vs-exception-in-Java/http://javaconceptoftheday.com/wp-content/uploads/2015/04/ErrorVsException.png

5
roottraveller

La description de la classe Error est assez claire:

Un Error est une sous-classe de Throwable 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'erreur ThreadDeath, bien qu'une condition "normale", est également une sous-classe de Error 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 Errors, 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).

3
Tobias Müller

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.

  • La deuxième différence entre 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). enter image description here

2

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.

1
Mr. Will

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.

Source: différence entre erreur et exception en Java

0
user2485429

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.

0
egaga