Quelqu'un veuillez expliquer la différence entre java.lang.RuntimeException
et java.lang.Exception
? Comment puis-je décider lequel prolonger si je crée ma propre exception?
210
Généralement, les exceptions RuntimeException sont des exceptions qui peuvent être empêchées par programme. Par exemple NullPointerException
, ArrayIndexOutOfBoundException
. Si vous vérifiez null
avant d'appeler une méthode, NullPointerException
cela ne se produira jamais. De même ArrayIndexOutOfBoundException
ne se produira jamais si vous vérifiez d'abord l'index. RuntimeException
ne sont pas vérifiés par le compilateur, c'est donc du code propre.
EDIT : De nos jours, les gens préfèrent RuntimeException
parce que le code propre qu'il produit. C'est totalement un choix personnel.
RuntimeException
est parce que c'est simple et évite de penser aux différences entre les exceptions vérifiées et non contrôlées. Je pense que la capture d'exceptions d'exécution est une idée terrible, car vous allez intercepter des exceptions irrécupérables telles queNullPointerException
.En Java, il existe deux types d'exceptions: les exceptions vérifiées et les exceptions non vérifiées. Une exception vérifiée doit être gérée explicitement par le code, tandis qu'une exception non vérifiée n'a pas besoin d'être gérée explicitement.
Pour les exceptions vérifiées, vous devez soit placer un bloc try / catch autour du code qui pourrait potentiellement lever l'exception, soit ajouter une clause "throws" à la méthode, pour indiquer que la méthode peut lever ce type d'exception (qui doit être dans la classe appelante ou au-dessus).
Toute exception qui dérive de "Exception" est une exception vérifiée, tandis qu'une classe qui dérive de RuntimeException n'est pas vérifiée. Les RuntimeExceptions n'ont pas besoin d'être explicitement gérées par le code appelant.
la source
Avant de regarder la différence entre les classes
java.lang.RuntimeException
etjava.lang.Exception
, vous devez connaître laException
hiérarchie. Les classesException
etError
sont dérivées de la classeThrowable
(qui dérive de la classeObject
). Et la classeRuntimeException
est dérivée de la classeException
.Toutes les exceptions proviennent , soit de
Exception
ouRuntimeException
.Toutes les exceptions qui en dérivent
RuntimeException
sont appelées exceptions non vérifiées. Et toutes les autres exceptions sont vérifiées exceptions . Une exception vérifiée doit être interceptée quelque part dans votre code, sinon elle ne sera pas compilée. C'est pourquoi elles sont appelées exceptions vérifiées. En revanche, avec des exceptions non vérifiées, la méthode d'appel n'est pas obligée de la gérer ou de la déclarer.Par conséquent, toutes les exceptions que le compilateur vous oblige à gérer sont directement dérivées
java.lang.Exception
et toutes les autres que le compilateur ne vous oblige pas à gérer sont dérivées dejava.lang.RuntimeException
.Voici quelques-unes des sous-classes directement connues de RuntimeException .
la source
Une exception est vérifiée et une exception RuntimeException n'est pas cochée.
Coché signifie que le compilateur requiert que vous gériez l'exception dans un catch, ou déclariez votre méthode comme la lançant (ou l'une de ses superclasses).
Généralement, lancez une exception vérifiée si l'appelant de l'API est censé gérer l'exception, et une exception non vérifiée si c'est quelque chose que l'appelant ne serait normalement pas en mesure de gérer, comme une erreur avec l'un des paramètres, c'est-à-dire une programmation erreur.
la source
Les classes d'exceptions d'exécution (RuntimeException et ses sous-classes) sont exemptées de la vérification au moment de la compilation, car le compilateur ne peut pas établir que des exceptions au moment de l'exécution ne peuvent pas se produire. (de JLS).
Dans les classes que vous concevez, vous devez sous- classer l'exception et en lancer des instances pour signaler tout scénario exceptionnel. En faisant cela, vous signalerez explicitement aux clients de votre classe que l'utilisation de votre classe peut lever une exception et ils doivent prendre des mesures pour gérer ces scénarios exceptionnels.
Les extraits de code ci-dessous expliquent ce point:
Dans la définition de classe ci-dessus de la classe Process , la méthode
execute
peut lever une RuntimeException mais la déclaration de méthode n'a pas besoin de spécifier qu'elle lève RuntimeException .La méthode
process
lève une exception vérifiée et elle doit déclarer qu'elle lèvera une exception vérifiée de type MyException et ne pas le faire sera une erreur de compilation.La définition de classe ci-dessus affectera le code qui utilise Process classe .
L'appel
new Process().execute()
est une invocation valide où l'appel de formulairenew Process().process()
donne une erreur de compilation. En effet, le code client doit prendre des mesures pour gérerMyException
(par exemple, l'appel à process () peut être placé dans un bloc try / catch).la source
Une bonne utilisation de RuntimeException?
Des exceptions non contrôlées - La controverse :
Notez qu'une exception non
RuntimeException
vérifiée en est une dérivée et une exception vérifiée en est une dérivéeException
.Pourquoi lancer un
RuntimeException
si un client ne peut rien faire pour se remettre de l'exception? L'article explique:la source
Depuis la documentation d'Oracle:
Les exceptions d'exécution représentent des problèmes qui sont le résultat d'un problème de programmation et en tant que tel, le code client API ne peut raisonnablement pas s'attendre à en récupérer ou à les gérer de quelque manière que ce soit.
Les RuntimeExceptions sont comme des "exceptions par utilisation non valide d'une API". Exemples d'exceptions à l'exécution: IllegalStateException, NegativeArraySizeException, NullpointerException
Avec les exceptions, vous devez l'attraper explicitement car vous pouvez toujours faire quelque chose pour récupérer. Des exemples d'exceptions sont: IOException, TimeoutException, PrintException ...
la source
En termes simples, si votre client / utilisateur peut récupérer de l'exception, faites-en une exception vérifiée , si votre client ne peut rien faire pour récupérer de l'exception, faites-en une RuntimeException non vérifiée . Par exemple, une RuntimeException serait une erreur de programmation, comme la division par zéro, aucun utilisateur ne peut rien y faire sauf le programmeur lui-même, alors c'est une RuntimeException .
la source
RuntimeException est une classe enfant de la classe Exception
Il s'agit de l'une des nombreuses classes enfants de la classe Exception. 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 tenue de déclarer dans sa clause throws toutes les sous-classes de RuntimeException qui pourraient être levées pendant l'exécution de la méthode mais non interceptées.
La hiérarchie est
java.lang.Object
--- java.lang.Throwable
------- java.lang.Exception
------------- java.lang.RuntimeException
la source
Les exceptions sont un bon moyen de gérer les événements inattendus dans votre flux d'application. Les RuntimeException ne sont pas contrôlées par le compilateur, mais vous préférerez peut-être utiliser des exceptions qui étendent la classe d'exception pour contrôler le comportement de vos clients api car ils doivent détecter les erreurs à compiler. Forme également une bonne documentation.
Si vous souhaitez obtenir une interface propre, utilisez l'héritage pour sous-classer les différents types d'exceptions de votre application, puis exposez l'exception parent.
la source
Il existe deux types d'exceptions, vous pouvez récupérer à partir d'une exception vérifiée si vous obtenez ce type d'exception. Les exceptions à l'exécution sont irrécupérables, les exceptions à l'exécution sont des erreurs de programmation, et le programmeur doit s'en occuper lors de l'écriture du code, et poursuivre son exécution pourrait vous donner un résultat incorrect. Les exceptions d'exécution concernent la violation de la condition préalable ex. vous avez un tableau de taille 10 et vous essayez d'accéder au 11 e élément, il lèvera ArrayIndexOutOfBoundException
la source
L'exception définie par l'utilisateur peut être une exception vérifiée ou une exception non vérifiée. Cela dépend de la classe à laquelle elle s'étend.
L'exception définie par l'utilisateur peut être une exception vérifiée personnalisée, si elle s'étend à la classe Exception
L'exception définie par l'utilisateur peut être une exception personnalisée non vérifiée, si elle s'étend à la classe d'exception d'exécution.
Définir une classe et en faire un enfant de l'exception ou de l'exception d'exécution
la source