web-dev-qa-db-fra.com

Différence entre une exception non vérifiée ou une exception d'exécution

C'était une question d'entrevue. Quelle est la principale différence entre une exception non vérifiée et une erreur, car les deux ne sont pas interceptés? Ils mettront fin au programme.

33
giri

Comme indiqué par leur nom, exceptions non vérifiées ne sont pas vérifiées à la compilation ce qui signifie que le compilateur ne le fait pas nécessitent des méthodes pour les attraper ou les spécifier (avec un throws). Les classes appartenant à cette catégorie sont détaillées dans la section 11.2 Vérification à la compilation des exceptions du JLS:

Les classes d'exceptions non cochées sont la classe RuntimeException et ses sous-classes, et la classe Error et ses sous-classes . Toutes les autres classes d'exceptions sont classes d'exceptions vérifiées. L'API Java API définit un certain nombre de classes d'exceptions, cochées et non cochées. Des classes d'exceptions supplémentaires, cochées et non cochées, peuvent être déclarées par les programmeurs. Voir §11.5 pour une description de la hiérarchie des classes d'exceptions et de certaines des classes d'exceptions définies par Java API et Java virtual machine.

L'image suivante illustre la hiérarchie des exceptions:

alt text

La classe Error et ses sous-classes sont des exceptions dont les programmes ordinaires ne sont généralement pas censés récupérer et, comme expliqué dans 11.5 La hiérarchie des exceptions :

La classe Error est une sous-classe distincte de Throwable, distincte de Exception dans la hiérarchie des classes, pour permettre aux programmes d'utiliser l'idiome:

} catch (Exception e) {

pour intercepter toutes les exceptions à partir desquelles la récupération peut être possible sans intercepter les erreurs dont la récupération n'est généralement pas possible.

Pour résumer, RuntimeException sont un sous-ensemble de exceptions non vérifiées pour les exceptions à partir desquelles la récupération est possible (mais une exception non vérifiée n'est pas un synonyme de RuntimeException car beaucoup répondent ici).

60
Pascal Thivent

Les JavaDocs les résument assez bien.

Java.lang.RuntimeException :

RuntimeException est la superclasse de ces exceptions qui peuvent être levées pendant le fonctionnement normal de la machine virtuelle Java.

Une méthode n'est pas obligée de déclarer dans sa clause throws les sous-classes de RuntimeException qui pourraient être levées pendant l'exécution de la méthode mais non interceptées.

Java.lang.Error :

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.

Notez que "exception non cochée" est simplement un synonyme de RuntimeException.

9
matt b

Remarque: une RuntimeException IS une exception non cochée

Une exception non cochée serait une exception connue pour être possible à un moment de l'exécution mais qui n'est pas interceptée, par exemple une exception NullPointerException est toujours une possibilité si vous ne les vérifiez pas et entraînera l'arrêt de votre programme. Vous pouvez le vérifier en enveloppant le code dans try-catch, mais cela n'est pas appliqué (contrairement à une exception vérifiée qui imposera que l'exception soit gérée d'une manière ou d'une autre).

Une erreur est quelque chose qui peut se produire à tout moment pendant l'exécution et ne peut pas vraiment être interceptée car elle n'est pas explicitement causée par un appel de méthode particulier, etc. Par exemple, une OutOfMemoryError ou une StackOverflowError. Ces deux problèmes peuvent survenir à tout moment et entraîner la fermeture de votre application. Attraper ces erreurs n'a aucun sens car elles indiquent qu'il s'est produit quelque chose dont vous ne pourrez pas récupérer.

4
DaveJohnston

Erreurs indiquent des problèmes fondamentaux qui ne devraient jamais se produire. Si vous rencontrez une erreur s.th. vraiment mauvais arrivé.
Exceptions non vérifiées (Exceptions d'exécution) d'autre part sont utilisées chaque fois qu'une exception pourrait être attendue d'une manière ou d'une autre, mais il n'y a pas de moyen raisonnable de la traiter alors et donc une instruction try catch serait juste ennuyeux et un gaspillage d'espace.

3
user306708

Exception vérifiée:

  • Les classes qui étendent la classe Throwable sauf RuntimeException et Error sont appelées exceptions vérifiées.
  • Également appelée exception à la compilation, car ces types d'exceptions sont vérifiées au moment de la compilation. Cela signifie que si nous ignorons ces exceptions (non traitées avec try/catch Ou throw l'exception), alors une erreur de compilation s'est produite.
  • Ce sont des problèmes récupérables par programme qui sont causés par des conditions inattendues hors du contrôle du code (par exemple, base de données en panne, erreur d'E/S de fichier, mauvaise entrée, etc.)
  • Nous pouvons les éviter en utilisant le bloc try/catch.
  • Exemple:IOException, SQLException etc

Exception non vérifiée:

  • Les classes qui étendent RuntimeException sont appelées exceptions non vérifiées
  • Les exceptions non vérifiées ne sont pas vérifiées au moment de la compilation, elles sont plutôt vérifiées à l'exécution. Et c'est pourquoi elles sont également appelées "Exception d'exécution"
  • Ce sont aussi des problèmes récupérables par programme, mais contrairement à exception vérifiée ils sont causés par des erreurs dans le flux de code ou la configuration.
  • Exemple:ArithmeticException, NullPointerException, ArrayIndexOutOfBoundsException etc
  • Puisqu'il s'agit d'une erreur de programmation, ils peuvent être évités par un codage bien/judicieux. Par exemple, "diviser par zéro" se produit ArithmeticEceeption. Nous pouvons les éviter par une simple condition if - if(divisor!=0). De même, nous pouvons éviter NullPointerException en vérifiant simplement les références - if(object!=null) ou en utilisant even meilleures techniques

Erreur:

  • Error fait référence à une situation irrémédiable qui n'est pas gérée par try/catch
  • Exemple:OutOfMemoryError, VirtualMachineError, AssertionError etc.
3
Razib

Erreur : Ce sont des conditions exceptionnelles qui sont externes à l'application, et que l'application ne peut généralement pas anticiper ou récupérer.

Exception d'exécution : Ce sont des conditions exceptionnelles qui sont internes à l'application, et que l'application ne peut généralement pas anticiper ou récupérer.

Vous voudrez peut-être lire this :

2
Vineeta Khatuja

Les erreurs et les exceptions d'exécution sont collectivement appelées exceptions non contrôlées.

les exceptions d'exécution sont des conditions exceptionnelles qui sont internes à l'application et dont l'application ne peut généralement pas anticiper ou récupérer. Ceux-ci indiquent généralement des bogues de programmation, tels que des erreurs de logique ou une mauvaise utilisation d'une API

Vous voudrez peut-être jeter un œil à ce lien qui explique les trois types d'exceptions.

http://docs.Oracle.com/javase/tutorial/essential/exceptions/catchOrDeclare.html

J'espère que ça aide.

1
grepit

RuntimeExceptions et des erreurs comme OutOfMemoryError n'ont pas besoin d'être interceptées et peuvent être lancées jusqu'à ce qu'elles atteignent main () qui mettra fin à l'application.

D'autres exceptions provoquent une erreur de compilation si elles ne sont pas interceptées ou incluses dans la liste des lancers.

1
stacker