Publicité
Une exception dans la programmation signifie une condition exceptionnelle à un moment donné de l'exécution du programme. Il est utilisé lorsque la condition exceptionnelle peut être mieux gérée ailleurs que là où elle est rencontrée. Considérez les exemples suivants:
- L'échec d'ouverture d'un fichier de configuration peut être mieux géré plus haut dans le code, peut-être en utilisant un autre emplacement de fichier de configuration.
- Accéder à un élément de tableau Comment utiliser une liste de tableaux JavaUn tableau Java est un tableau redimensionnable à usage général. Il fournit la plupart des fonctionnalités généralement attendues des tableaux dans d'autres langues. Dans cet article, vous apprendrez à configurer et à utiliser un arraylist. Lire la suite en dehors des limites du tableau signifie un bogue de programme. Bon débogage!
- Une erreur d'analyse XML doit être portée à la connaissance de l'utilisateur afin que le fichier XML puisse être corrigé.
- Le programme manquant de mémoire (peut-être lors du traitement d'un fichier volumineux) peut être corrigé en augmentant peut-être la quantité de mémoire disponible pour le processus java.
Dans tous ces cas (et plus), l'exception doit être gérée en dehors de l'emplacement où elle est générée afin que la cause sous-jacente puisse être traitée.
Types d'exceptions
L'image ci-dessous montre les principales parties de la hiérarchie des exceptions Java. La classe de base est Throwable qui est sous-classé en Exception et Erreur. Classe Exception concerne les conditions liées au programme que les applications peuvent détecter pour tenter de sauver la situation. Classe Erreur, d'autre part, sert à indiquer de graves erreurs dans l'environnement d'exécution Java que les applications ne devraient pas intercepter. Quelques exemples sont: OutOfMemoryError et StackOverflowError.
Une Exception est à nouveau de deux types: coché et décoché. Une exception vérifiée doit être gérée par le code appelant. Cette règle est appliquée par le compilateur java. Une exception non vérifiée, en revanche, peut être propagée dans la chaîne d'appels sans avoir à la déclarer explicitement. Les exemples ci-dessous clarifieront.
Exceptions vérifiées
La méthode suivante tente de créer FileReader à partir d'un fichier. Le constructeur lève une exception vérifiée FileNotFoundException qui doit être géré par le code appelant ou déclaré comme étant levé.
Le code suivant ne pas compiler puisqu'il ne fait ni l'un ni l'autre.
private void loadFile (String filename) {FileReader in = new FileReader (filename); }
Une façon d'obtenir le code à compiler est de gérer l'exception (voir ci-dessous).
private void loadFile (String filename) {try {FileReader in = new FileReader (filename)); {} catch (FileNotFoundException ex) {// gérer l'exception ici} }
Si l'exception ne peut pas être gérée directement par l'appelant, elle doit être déclarée dans la signature de la méthode.
private void loadFile (String filename) lève java.io. FileNotFoundException. {FileReader in = new FileReader (filename)); { }
Exceptions non vérifiées
Une exception non vérifiée est une exception qui est sous-classée de RuntimeException et n'ont pas besoin d'être traités directement ou déclarés comme ci-dessus. Par exemple, le code suivant entraîne un NullPointerException, qui est un type de RuntimeException. Le code compile cependant sans erreur puisque NullPointerException est une exception non contrôlée.
private void handleEvent () {String name = null; if (name.length ()> 0) {} }
Exceptions d'habillage
Compte tenu de la discussion ci-dessus sur les exceptions vérifiées et non contrôlées, il semble qu'il est plus facile de traiter les exceptions non contrôlées car vous n'avez pas à les déclarer ou à les gérer vous-même. Avec cette commodité à l'esprit, il peut parfois être utile d'encapsuler une exception vérifiée dans une exception non vérifiée.
L'exemple de code suivant montre comment encapsuler une exception. La méthode méthode_1 () jette un SQLException dans son corps. Pour que le code se compile correctement, l'exception doit être déclarée comme levée.
private void method_1 () lève SQLException {... lancer une nouvelle SQLException; }
Lorsque cette méthode est invoquée à partir d'une autre méthode (method_2 ()), cette méthode peut SQLException et l'enrouler dans une exception non vérifiée, il n'a donc pas à déclarer l'exception dans sa signature de méthode.
private void method_2 () {try {method_1 (); } catch (java.sql. SQLException ex) {lancer une nouvelle RuntimeException (ex); } }
Trace de pile d'exception
Une trace de pile d'exception fait référence au tableau de trames de pile actives, chacune représentant un appel de méthode, capturé par la machine virtuelle Java au moment où l'exception a été levée. Chaque cadre de pile inclut l'emplacement de l'appel de méthode, y compris le nom de classe, le nom de méthode et éventuellement le nom du fichier source java et le numéro de ligne dans le fichier. Il est utile pour retracer la séquence d'appels qui a provoqué l'erreur Exceptions Java: les gérez-vous correctement?Une exception dans la programmation signifie une condition exceptionnelle dans l'exécution du programme. Il est utilisé lorsque la condition peut être mieux gérée ailleurs. Considérez les exemples suivants de gestion des exceptions Java. Lire la suite .
Voici une trace de pile typique, obtenue à partir de l'objet d'exception lors de sa capture.
Exception dans le thread "principal" java.lang. IndexOutOfBoundsException: Index: 8, taille: 5 sur java.util. ArrayList.rangeCheck (ArrayList.java: 653) sur java.util. ArrayList.get (ArrayList.java: 429) sur sample.sample1.main (sample1.java: 24)
L'exception interceptée ici est IndexOutOfBoundsException. Il comprend des informations supplémentaires sur l'erreur. La trace de pile contient 3 cadres de pile, dont chacun inclut les informations d'emplacement comme indiqué.
Gestion des exceptions
Une exception peut être gérée en l'attrapant dans un essayer bloquer et prendre les mesures correctives nécessaires. le Exception L'objet fournit plusieurs méthodes pour extraire des informations sur la condition qui l'a provoquée.
Le code suivant enregistre le message d'erreur dans un fichier journal.
private void loadConfig () {try {// invoque du code qui pourrait générer une capture IOException} (java.io. IOException ex) {// gère l'exception ici. Peut être enregistré dans un fichier journal. log.warning (ex.getMessage ()); } }
Lorsqu'une exception est encapsulée dans une autre, vous pouvez récupérer l'exception encapsulée:
Cause susceptible d'être lancée = ex.getCause (); log.warning ("Cause sous-jacente:" + cause.getMessage ());
Avez-vous besoin d'accéder à la trace de la pile et peut-être d'extraire le nom de la méthode qui l'a provoquée?
StringBuilder sbuf = new StringBuilder ("Stack Trace:"); for (StackTraceElement el: ex.getStackTrace ()) {sbuf.append (el.getClassName () + "." + el.getMethodName ()). append ("\ n"); } log.warning (sbuf.toString ());
Ou peut-être, enregistrez l'exception et la relancez?
essayez {... } catch (java.io. IOException ex) {log.warning (ex.getMessage ()); jeter ex; }
le Exception classe fournit un printStackTrace () méthode qui peut imprimer la trace de la pile à votre choix PrintStream (ou PrintWriter).
essayez {... } catch (java.io. IOException ex) {PrintStream out =...; out.println (ex.getMessage ()); ex.printStackTrace (out); }
Vous pouvez intercepter plusieurs types d'exceptions en une seule essayer et effectuez une gestion spécifique pour chaque type d'exception.
try {// lève quelques exceptions ici. } catch (java.io. IOException ex) {// Gestion spécifique à IOException ici. } catch (java.sql. SQLException ex) {// Traitement spécifique à SQLException ici. }
Pour intercepter plusieurs types d'exceptions mais utiliser le même code de gestion, vous pouvez déclarer un capture bloc avec plusieurs types comme suit:
try {// lève quelques exceptions ici. } catch (java.io. IOException | java.sql. SQLException ex) {// IOException et traitement spécifique SQLException ici. } catch (SAXException ex) {// Gestion spécifique SAXException ici. }
Nettoyer les ressources avec enfin
Lorsque vous traitez avec du code qui peut lever des exceptions, il est essentiel d'effectuer un nettoyage approprié de toutes les ressources, tels que les fichiers ouverts Tout ce que vous devez savoir sur les formats de fichiers et leurs propriétésNous utilisons le fichier Word de manière interchangeable: musique, image, feuille de calcul, diaporama, etc. Mais qu'est-ce qui fait qu'un fichier est un «fichier» de toute façon? Essayons de comprendre cette partie fondamentale de l'informatique. Lire la suite , connexions aux bases de données, etc. Le nettoyage des ressources doit être effectué dans un enfin bloquer. De cette façon, la sortie normale et la sortie exceptionnelle d'un bloc invoquent la code de nettoyage Les 10 pires erreurs de programmation de l'histoireDans son passé légendaire, codant également la destruction provoquée. Des exemples d'un peu de mauvais code ont provoqué une catastrophe à un niveau majeur. Voici 10 des pires erreurs de programmation de l'histoire. Lire la suite .
InputStream in = null; essayez {... in = new FileInputStream (filename);... } catch (java.io. IOException ex) {log.warning (ex.getMessage ()); } enfin {// le code ici est exécuté à la sortie du bloc try, // normalement ou à cause d'une exception if (in! = null) in.close (); }
Bloc Try-With-Resources
Java 1.7 a introduit le essayer avec des ressources construction qui facilite le nettoyage des ressources. Cela ressemble à ceci:
try (InputStream in = new FileInputStream (..)) {// code qui utilise InputStream. }
Lorsque le code quitte le bloc (que ce soit proprement ou en raison d'une exception), le Flux d'entrée variable est automatiquement nettoyée.
Nettoyez plusieurs ressources en les déclarant toutes dans la tête du bloc.
try (InputStream in = new FileInputStream (..); Connexion con =...; ) {// code qui utilise InputStream et Connection. }
Tout objet dont la classe implémente le Fermeture automatique l'interface peut être nettoyée de cette manière. La classe suivante effectue un nettoyage spécifique dans le Fermer() méthode.
classe publique MyClass implémente AutoCloseable {public void close () {// code de nettoyage ici} }
Utilisez une instance de cette classe dans un essayer avec des ressources bloquer.
try (MyClass obj = new MyClass (..)) {// code qui utilise l'objet MyClass. }
Quelques exceptions couramment rencontrées
Voyons maintenant quelques exceptions courantes.
- IndexOutOfBoundsException (non cochée): indique que l'index de l'élément auquel on accède est hors des limites d'un tableau, d'une chaîne, etc.
- SQLException (cochée): levée en raison d'une erreur de base de données.
- IOException (vérifié): erreur d'accès au fichier ou erreurs liées à l'entrée et à la sortie.
- InterruptedException (cochée): levée lorsqu'une exécution de thread est interrompue.
- SAXException (cochée): levée en raison d'erreurs d'analyse XML.
- NullPointerException (non cochée): utiliser null lorsqu'un objet est requis.
Emballer
Les exceptions sont la principale méthode de rapport et de gestion des erreurs en Java. Utilisation appropriée des exceptions améliorer la qualité du code Écrivez ou codez plus rapidement dans votre éditeur de texte Linux avec des thèmes personnalisésVotre éditeur de texte Linux n'a pas besoin d'être terne et "fonctionnel". Pourquoi ne pas l'ajuster pour améliorer votre productivité, qu'il s'agisse de scripts et de codage ou de l'utilisation de l'outil comme éditeur de balisage? Lire la suite et aider à résoudre les problèmes de production.
Avez-vous des histoires de guerre liées aux exceptions à raconter? Si oui, parlez-nous-en dans la section commentaires ci-dessous.
Crédit d'image: Dmitry Nikolaev via Shutterstock.com