Différences entre exception et erreur

173

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?

Marco Leung
la source

Réponses:

178

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,
  • Exception non vérifiée (aka RuntimeException) - Très souvent une erreur de programmation telle qu'un NullPointerExceptionargument ou un argument illégal. Les applications peuvent parfois gérer ou récupérer de cette Throwablecatégorie - ou au moins l'attraper à la run()méthode de Thread , enregistrer la plainte et continuer à fonctionner.
  • Checked Exception (aka Everything else) - Les applications doivent pouvoir attraper et faire quelque chose de manière significative avec le reste, comme FileNotFoundExceptionet TimeoutException...
Eddie
la source
10
Oracle dit cela 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/… .
ROMANIA_engineer
1
La question sans réponse est en quoi RuntimeException et Error sont-ils différents par essence? Les deux sont non contrôlés et égaux à tous égards.
Pacerier
38

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.

Hiérarchie des exceptions Java

avandeursen
la source
6
Ignacio Soler Garcia
2
@IgnacioSolerGarcia Cela peut l'être et cela a même du sens (l'autre question est de savoir si c'est bien). Normalement, vous vérifiez si l'objet existe et ensuite appelez la méthode ou utilisez le champ. Mais vous pouvez, au lieu de vérifier l'existence, essayer d'attraper NPE à la place. Et enregistrez un message à ce sujet et continuez, par exemple.
Gangnus
@Gangnus: n'a aucun sens. N'oubliez pas qu'une exception saute des parties de code et est un moyen de signaler des erreurs, pas des opérations normales
Ignacio Soler Garcia
17

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.

Robin
la source
Regardez examples.javacodegeeks.com/java-basics/exceptions/… comme exemple. IllegalArgumentException est une exception d'exécution, pas une erreur. docs.oracle.com/javase/7/docs/api/java/lang/…
Gangnus
8

Erreurs -

  1. ErrorLes s en java sont de type java.lang.Error.
  2. Toutes les erreurs en java sont de type non coché.
  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. ErrorLes s sont principalement causés par l'environnement dans lequel l'application s'exécute.
  6. Exemples: java.lang.StackOverflowError ,java.lang.OutOfMemoryError

Exceptions -

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

lecture supplémentaire: http://javaconceptoftheday.com/difference-between-error-vs-exception-in-java/ http://javaconceptoftheday.com/wp-content/uploads/2015/04/ErrorVsException.png

roottraveller
la source
7

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.

Powerlord
la source
3

La description de la Errorclasse est assez claire:

An Errorest 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' 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 Errorqui 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.

Tobias Müller
la source
2

Il existe plusieurs similitudes et différences entre les classes java.lang.Exceptionet java.lang.Error.

Similitudes:

  • Tout d' abord - les deux classes s'étend java.lang.Throwableet par conséquent beaucoup hérite des méthodes qui sont communes à utiliser lors de la gestion d'erreurs telles que: getMessage, getStackTrace, printStackTraceet ainsi de suite.

  • Deuxièmement, en tant que sous-classes, java.lang.Throwableils 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 throwsmot clé. Une telle déclaration exigée que pour java.lang.Exceptionet sous - classes, pour java.lang.Throwable, java.lang.Erroret java.lang.RuntimeExceptionet leurs sous - classes est facultative.

    • Seules les java.lang.Throwablesous-classes et les sous-classes peuvent être utilisées dans la catchclause.

    • Seules les java.lang.Throwableclasses et les sous-classes peuvent être utilisées avec le mot-clé - throw.

La conclusion de cette propriété suit les deux java.lang.Erroret java.lang.Exceptionpeut être déclarée dans l'en-tête de la méthode, peut être dans une catchclause, peut être utilisée avec un mot-clé throw.

Différences:

  • Première - différence conceptuelle: java.lang.Errorconç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.Throwablesuccesseur).

    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.Exceptionconç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.

  • La deuxième différence entre java.lang.Erroret java.lang.Exceptionce 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.Errorou 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.Exceptiondé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). entrez la description de l'image ici

Mikhailov Valentine
la source
1

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.

M. Will
la source
1

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.

Source: différence entre l'erreur et l'exception en Java

user2485429
la source
"Les erreurs sont principalement causées par l'environnement dans lequel l'application s'exécute" et "Les exceptions sont principalement causées par l'application elle-même" parfait!
ADJ
0

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.

Egaga
la source
0

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. OutOfMemoryErrorse 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: NullPointerExceptionse 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.

pasignature
la source