Exceptions Java Les manipulez-vous correctement?

Exceptions Java Les manipulez-vous correctement? / La programmation

Une exception en 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:

  • Ne pas ouvrir 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ès à un élément de tableau Comment utiliser une ArrayList Java Comment utiliser une ArrayList Java Un arraylist 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 dictionnaire. En savoir plus en dehors des limites du tableau signifie un bogue de programme. Bon débogage!
  • Une erreur d'analyse XML doit être signalée à 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 devrait ê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 Jetable qui est sous-classé dans Exception et Erreur. Classe Exception est destiné aux conditions liées au programme que les applications peuvent intercepter pour tenter de sauver la situation. Classe Erreur, en revanche, cela indique les erreurs graves dans l'environnement d'exécution Java que les applications ne doivent pas détecter. Quelques exemples sont: OutOfMemoryError et StackOverflowError.

Un Exception est à nouveau de deux types: coché et décoché. Une exception vérifiée doit être traitée par le code appelant. Cette règle est appliquée par le compilateur Java. En revanche, une exception non contrôlée peut être propagée dans la chaîne d’appel sans devoir 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 manipulé par le code appelant ou déclaré être jeté.

Le code suivant sera ne pas compiler car il ne fait ni.

private void loadFile (nom de fichier de la chaîne) FileReader in = new FileReader (nom du fichier);  

Une façon d'obtenir le code à compiler est de gérer l'exception (voir ci-dessous).

private void loadFile (nom de fichier de la chaîne) try FileReader in = new FileReader (nom du fichier));  catch (FileNotFoundException ex) // gérer l'exception ici 

Si l'exception ne peut pas être traité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 (nomfichier));  

Exceptions non contrôlées

Une exception non contrôlée est une exception qui est sous-classée de RuntimeException et n'a pas besoin d'être traité directement ou déclaré comme ci-dessus. Par exemple, le code suivant génère une NullPointerException, qui est un type de RuntimeException. Le code, cependant, compile sans erreur depuis NullPointerException est une exception non contrôlée.

private void handleEvent () Nom de la chaîne = null; if (name.length ()> 0)  

Exceptions d'emballage

Compte tenu de la discussion ci-dessus sur les exceptions cochées et non contrôlées, il apparaît qu'il est plus facile de traiter les exceptions non contrôlées car vous n'avez pas à les déclarer ni à les gérer vous-même. Avec cette commodité à l’esprit, il peut parfois être utile d’envelopper 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 method_1 () jette un SQLException dans son corps. Pour que le code soit compilé correctement, l'exception doit être déclarée pour être levée..

private void method_1 () lève SQLException … lève une nouvelle SQLException;  

Lorsque cette méthode est appelée depuis une autre méthode (method_2 ()), cette méthode peut attraper le SQLException et l'envelopper dans une exception non contrôlée, afin qu'il ne soit pas obligé de déclarer l'exception dans la signature de la méthode.

void privé method_2 () try method_1 ();  catch (java.sql.SQLException ex) lance la 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 au moment de la levée de l'exception. Chaque cadre de pile inclut l'emplacement de l'appel de la méthode, y compris le nom de la classe, le nom de la 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 ayant provoqué l'erreur Exceptions Java: les gérez-vous correctement? Exceptions Java: les manipulez-vous correctement? Une exception en programmation signifie une condition exceptionnelle dans l'exécution du programme. Il est utilisé lorsque la maladie 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 exception quand il a été attrapé.

Exception dans le fil "principal" java.lang.IndexOutOfBoundsException: Index: 8, Size: 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 prise ici est IndexOutOfBoundsException. Il inclut des informations supplémentaires sur l'erreur. La trace de la pile contient 3 cadres de pile, chacun comprenant les informations de localisation illustrées.

Gestion des exceptions

Une exception peut être traitée en la capturant dans un try-catch bloquer et prendre les mesures correctives nécessaires. le Exception objet fournit plusieurs méthodes pour extraire des informations sur la condition qui l'a provoqué.

Le code suivant enregistre le message d'erreur dans un fichier journal.

private void loadConfig () try // invoque un code susceptible de générer une exception IOException catch (java.io.IOException ex) // gère une exception ici. Peut être connecté à 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 jetable = ex.getCause (); log.warning ("Cause sous-jacente:" + cause.getMessage ()); 

Avez-vous besoin d'accéder à la trace de la pile et éventuellement 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, connectez-vous l'exception et relancez-la?

essayez … catch (java.io.IOException ex) log.warning (ex.getMessage ()); lancer ex;  

le Exception la classe fournit un printStackTrace () méthode qui peut imprimer la trace de la pile à votre propre 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 fois. essayer bloquer et effectuer un traitement spécifique pour chaque type d'exception.

try // lève quelques exceptions ici catch (java.io.IOException ex) // traitement spécifique à IOException ici catch (java.sql.SQLException ex) // traitement spécifique à SQLException ici 

Pour intercepter plusieurs types d’exceptions tout en utilisant le même code de traitement, vous pouvez déclarer capture bloquer avec plusieurs types comme suit:

try // lève quelques exceptions ici catch (java.io.IOException | java.sql.SQLException ex) // traitement spécifique IOException et SQLException ici catch (SAXException ex) // traitement spécifique SAXException ici 

Nettoyage des ressources avec Finally

Lorsque vous traitez avec du code pouvant générer des exceptions, il est essentiel de nettoyer correctement toutes les ressources, telles que les fichiers ouverts. Tout ce que vous devez savoir sur les formats de fichier et leurs propriétés Tout ce que vous devez savoir sur les formats de fichier et leurs propriétés Nous utilisons le mot fichier interchangeable: musique, image, feuille de calcul, diaporama, etc. Mais qu'est-ce qui fait qu'un fichier est un "fichier"? Essayons de comprendre cette partie fondamentale de l'informatique. En savoir plus, connexions à la base de données, etc. Le nettoyage des ressources doit s'effectuer de enfin bloc. De cette manière, les sorties normales et les sorties exceptionnelles d'un bloc invoquent le code de nettoyage. Les 10 pires erreurs de programmation de l'histoire Les 10 pires erreurs de programmation de l'histoire De son passé, le codage a également entraîné la destruction. Les cas de mauvais code ont provoqué un désastre majeur. Voici 10 des pires erreurs de programmation de l’histoire. Lire la suite .

InputStream in = null; try … in = new FileInputStream (nomfichier);… catch (java.io.IOException ex) log.warning (ex.getMessage ());  finally // le code ici est exécuté à la sortie du bloc try, // soit normalement, soit à cause d'une exception if (in! = null) in.close ();  

Bloc d'essais avec ressources

Java 1.7 a introduit le essayer avec les ressources construire qui facilite le nettoyage des ressources. Cela ressemble à ceci:

try (InputStream in = new FileInputStream (…)) // code utilisant le programme InputStream.  

Lorsque le code quitte le bloc (proprement ou suite à 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 (…); Connection con =…;) // code qui utilise InputStream et Connection.  

Tout objet dont la classe implémente le AutoCloseable L’interface peut être nettoyée de cette manière. La classe suivante effectue un nettoyage spécifique dans la Fermer() méthode.

public class MyClass implémente AutoCloseable public void close () // code de nettoyage ici 

Utiliser une instance de cette classe dans un essayer avec les ressources bloc.

try (MyClass obj = new MyClass (…)) // code utilisant l'objet MyClass.  

Quelques exceptions communément rencontrées

Voyons maintenant quelques exceptions courantes..

  • IndexOutOfBoundsException (décoché): indique que l'index de l'élément auquel on accède se situe hors des limites d'un tableau, d'une chaîne, etc..
  • SQLException (vérifié): levé à cause d'une erreur de base de données.
  • IOException (vérifié): erreur d'accès au fichier ou erreurs d'entrée et de sortie.
  • InterruptedException (vérifié): levé quand une exécution de fil est interrompue.
  • SAXException (vérifié): levé à cause d'erreurs d'analyse XML.
  • NullPointerException (décoché): utilisation de null lorsqu'un objet est requis.

Emballer

Les exceptions constituent la principale méthode de rapport et de gestion des erreurs en Java. Une utilisation correcte des exceptions améliore la qualité du code. Écriture ou code plus rapide dans votre éditeur de texte Linux avec des thèmes personnalisés Écriture ou code plus rapide dans votre éditeur de texte Linux avec des thèmes personnalisés Votre éditeur de texte Linux ne doit pas paraître terne et "fonctionnel". Pourquoi ne pas l'ajuster pour améliorer votre productivité, qu'il s'agisse de scripts et de codage ou d'utiliser l'outil comme éditeur de balisage? En savoir plus et aider à résoudre les problèmes de production.

Avez-vous des histoires de guerre relatives aux exceptions à raconter? Si oui, parlez-nous dans la section commentaires ci-dessous.

Crédit d'image: Dmitry Nikolaev via Shutterstock.com

En savoir plus sur: Java, Programmation.