... et le code appelant cette méthode doit gérer ou propager cette exception (ou les deux):
try{int i =5;
myObject.calculate(5);}catch(FooException ex){// Print error and terminate application.
ex.printStackTrace();System.exit(1);}catch(IOException ex){// Rethrow as FooException.thrownewFooException(ex);}
Vous remarquerez dans l'exemple ci-dessus qui IOExceptionest capturé et relancé comme FooException. Il s'agit d'une technique courante utilisée pour encapsuler les exceptions (généralement lors de la mise en œuvre d'une API).
Parfois, il y aura des situations où vous ne voudrez pas forcer chaque méthode à déclarer votre implémentation d'exception dans sa clause throws. Dans ce cas, vous pouvez créer une exception non cochée . Une exception non cochée est toute exception qui s'étend java.lang.RuntimeException(qui elle-même est une sous-classe de java.lang.Exception):
Les exceptions non vérifiées sont généralement utilisées pour désigner une erreur de programmeur, par exemple en passant un argument non valide à une méthode ou en tentant de franchir les limites d'un index de tableau.
La java.lang.Throwableclasse est la racine de toutes les erreurs et exceptions qui peuvent être levées dans Java. java.lang.Exceptionet java.lang.Errorsont tous deux des sous-classes de Throwable. Tout ce qui fait partie des sous-classes Throwablepeut être jeté ou attrapé. Cependant, il est généralement une mauvaise pratique d'attraper ou de lancer Errorcar cela est utilisé pour désigner des erreurs internes à la JVM qui ne peuvent généralement pas être "gérées" par le programmeur (par exemple OutOfMemoryError). De même, vous devez éviter d'attraper Throwable, ce qui pourrait vous amener à attraper Errors en plus de Exceptions.
Techniquement, tout ce qui s'étend Throwablepeut être levé, mais les exceptions sont généralement des extensions de la Exceptionclasse afin qu'elles soient des exceptions vérifiées (sauf RuntimeException ou les classes basées sur elle, qui ne sont pas vérifiées), par opposition à l'autre type courant de jetable, Errors qui ne sont généralement pas conçus pour être gérés avec élégance au-delà des internes de la JVM.
Vous pouvez également rendre les exceptions non publiques, mais vous ne pouvez les utiliser que dans le package qui les définit, par opposition à tous les packages.
En ce qui concerne le lancement / la capture d'exceptions personnalisées, cela fonctionne comme les exceptions intégrées - throw via
RuntimeException étend l'exception et n'est pas une exception vérifiée.
Adamski
2
Techniquement, tout ce qui s'étend Throwablepeut être jeté ; les exceptions s'étendent Exception. Une sous-classe personnalisée de Throwable ne serait pas interceptée par un try { ... } catch (Exception e) { ... }bloc.
Andrzej Doyle
Pourquoi les gens votent-ils pour cette réponse? Il contient quelques inexactitudes. 1) Vous ne pouvez pas implémenter jetable car c'est une interface. 2) Tout ce qui étend Throwable n'est PAS une exception (ce Errorn'est pas une exception, c'est une erreur). 3) Cela implique que toute sous-classe d'Exception est vérifiée alors que RuntimeException ne l'est pas. La réponse donnée par Adamski est bien plus précise!
oxbow_lakes
Oups, je voulais dire que jetable n'est pas une interface bien sûr!
oxbow_lakes
@oxbow_lakes - la solution idéale serait de corriger les inexactitudes, non? Quoi qu'il en soit, je les ai corrigés moi-même puisque personne d'autre ne l'a fait.
Réponses:
Pour définir une exception cochée, vous créez une sous-classe (ou une hiérarchie de sous-classes) de
java.lang.Exception
. Par exemple:Les méthodes qui peuvent potentiellement lever ou propager cette exception doivent la déclarer:
... et le code appelant cette méthode doit gérer ou propager cette exception (ou les deux):
Vous remarquerez dans l'exemple ci-dessus qui
IOException
est capturé et relancé commeFooException
. Il s'agit d'une technique courante utilisée pour encapsuler les exceptions (généralement lors de la mise en œuvre d'une API).Parfois, il y aura des situations où vous ne voudrez pas forcer chaque méthode à déclarer votre implémentation d'exception dans sa clause throws. Dans ce cas, vous pouvez créer une exception non cochée . Une exception non cochée est toute exception qui s'étend
java.lang.RuntimeException
(qui elle-même est une sous-classe dejava.lang.Exception
):Les méthodes peuvent lancer ou propager une
FooRuntimeException
exception sans la déclarer; par exempleLes exceptions non vérifiées sont généralement utilisées pour désigner une erreur de programmeur, par exemple en passant un argument non valide à une méthode ou en tentant de franchir les limites d'un index de tableau.
La
java.lang.Throwable
classe est la racine de toutes les erreurs et exceptions qui peuvent être levées dans Java.java.lang.Exception
etjava.lang.Error
sont tous deux des sous-classes deThrowable
. Tout ce qui fait partie des sous-classesThrowable
peut être jeté ou attrapé. Cependant, il est généralement une mauvaise pratique d'attraper ou de lancerError
car cela est utilisé pour désigner des erreurs internes à la JVM qui ne peuvent généralement pas être "gérées" par le programmeur (par exempleOutOfMemoryError
). De même, vous devez éviter d'attraperThrowable
, ce qui pourrait vous amener à attraperError
s en plus deException
s.la source
Jetez-le comme:
Catch comme:
la source
Pour une exception vérifiée:
Techniquement, tout ce qui s'étend
Throwable
peut être levé, mais les exceptions sont généralement des extensions de laException
classe afin qu'elles soient des exceptions vérifiées (sauf RuntimeException ou les classes basées sur elle, qui ne sont pas vérifiées), par opposition à l'autre type courant de jetable,Error
s qui ne sont généralement pas conçus pour être gérés avec élégance au-delà des internes de la JVM.Vous pouvez également rendre les exceptions non publiques, mais vous ne pouvez les utiliser que dans le package qui les définit, par opposition à tous les packages.
En ce qui concerne le lancement / la capture d'exceptions personnalisées, cela fonctionne comme les exceptions intégrées - throw via
et attraper via
la source
Throwable
peut être jeté ; les exceptions s'étendentException
. Une sous-classe personnalisée de Throwable ne serait pas interceptée par untry { ... } catch (Exception e) { ... }
bloc.Error
n'est pas une exception, c'est une erreur). 3) Cela implique que toute sous-classe d'Exception est vérifiée alors que RuntimeException ne l'est pas. La réponse donnée par Adamski est bien plus précise!