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.
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 classeError
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:
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 deThrowable
, distincte deException
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).
Les JavaDocs les résument assez bien.
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.
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
.
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.
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.
Exception vérifiée:
Throwable
sauf RuntimeException
et Error
sont appelées exceptions vérifiées.try/catch
Ou throw
l'exception), alors une erreur de compilation s'est produite.try/catch
.IOException
, SQLException
etcException non vérifiée:
RuntimeException
sont appelées exceptions non vérifiéesArithmeticException
, NullPointerException
, ArrayIndexOutOfBoundsException
etcArithmeticEceeption
. 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 techniquesErreur:
Error
fait référence à une situation irrémédiable qui n'est pas gérée par try/catchOutOfMemoryError
, VirtualMachineError
, AssertionError
etc.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 :
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.
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.