Les exceptions (rappel de cours)

Définition

Les exceptions permettent de traiter les erreurs. Elles sont générées lorsqu’un évènement inattendu ou anormal se produit. Deux mécanismes principaux permettent d'acquitter une exception :

·        soit on la traite,

·        soit on la relaye à la méthode appelante.

Objets d’exceptions

En Java, toute erreur lors d'une instruction génère un OBJET exception. Cet objet est une instance d'une classe qui hérite de la classe Throwable.

ci-dessous un extrait de la hiérarchie de classes d'exceptions ci-dessous :  

·        class java.lang.Throwable

·        class java.lang.Error

·        class java.lang.LinkageError

·        class java.lang.VirtualMachineError

·        class java.lang.Exception

·        class java.lang.ClassNotFoundException

·        class java.util.zip.DataFormatException

·        class java.io.IOException

·        class java.lang.RuntimeException

·        class java.lang.ArithmeticException

·        class java.lang.ClassCastException

·        class java.lang.IllegalArgumentException

·        class java.lang.NumberFormatException

·        class java.lang.IndexOutOfBoundsException

·        class java.lang.ArrayIndexOutOfBoundsException

·        class java.lang.StringIndexOutOfBoundsException

·        class java.lang.NullPointerException

 

Throwable possède deux sous-classes: Error et Exception.

Vous n'avez pas à chercher un traitement pour les instances de la classe Error, ce sont des erreurs rares que seul Java pourra exploiter. Par contre, vous pouvez traiter les instances de la classe Exception.

Dans cette classe on retrouve des exceptions particulières: les RuntimeException (ces exceptions interviennent lors de l'exécution du programme pour différentes raisons: mauvais index de tableau, division par zéro ...).

Vous n'êtes pas obligés de traiter les RuntimeException. Par contre, toute exception ne dérivant pas de RuntimeException doit être prise en charge ou être déclarée.

Nous allons voir comment le mécanisme d'exception de Java permet de

·        capter les exceptions et de proposer un traitement à l'exception captée.

·        propager l'exception à la méthode appelante où l'exception sera traitée.

·        créer ses propres exceptions.

Traiter une exception

On utilise trois types de blocs d'instructions :

try { … } :  permet de spécifier une section de code sur laquelle on s'attend qu'une exception (une erreur) soit levée.

catch(exception e) { … } :    sert à spécifier le code à exécuter si une exception du type de celle passée en argument se produit. On peut avoir plusieurs blocs catch à la suite d’un bloc try si nécessaire.

finally { … } :      introduit un code de traitement d'exception, qui sera toujours exécuté qu’une exception est été levé ou non. Ce bloc est facultatif.

Code :

try {

  // des lignes de code susceptible de lever une exception

}

catch (IOException e) {

  // traitement de l'exception de type IO

}

finally {

  // traitement plus général

}

Propager l’exception

Lorsque les méthodes utilisées génèrent des exceptions, autres que des RuntimeException, on a le devoir de capter ces exceptions.

Mais parfois il n'est pas possible ou pas souhaité de traiter l'exception immédiatement. Dans ce cas on doit déclarer celle-ci en utilisant le mot-clé throws dans l'en-tête de la méthode susceptible de générer l'exception en question. On propage alors l'exception à la méthode appelante, c'est à dire à la méthode qui fait appel à la méthode à partir de laquelle l'exception est générée.

Autrement formulé : Si une méthode est susceptible de lever une exception qu’on ne veut pas gérer au sein de la méthode, elle se doit de prévenir les appelants avec le mot clé throws.

Exemple:

 

 void uneMethode (int a) throws ArithmeticException,IOException {

           ... ...

           ...

  }

 

Définir ses propres exceptions

Il est possible de créer applications vos propres classes d'exception. La nouvelle classe d'exception créée doit obligatoirement hériter de la classe Exception de Java ou d'une de ses sous-classes plus spécifiques.

La structure de votre nouvelle classe d'exception doit au moins posséder un des deux constructeurs:

·        un sans paramètre

·        un avec un paramètre de type String correspondant au message associé à l'erreur générée.

  Exemple de déclaration d'une nouvelle classe d'exception

class MaClasseException extends Exception{

      MaClasseException(){

             super();

      }

 

      MaClasseException(String monMessage){

             super(monMessage);

      }

Les méthodes de la classe Exception seront également disponibles pour votre nouvelle classe. Vous pourrez donc:

·        afficher la valeur du message éventuellement transmis en paramètre au constructeur de la classe grâce à la méthode getMessage()

·        afficher, sur la sortie d'erreur, la liste des appels ayant conduit à la génération de l'exception grâce à la méthode printStackTrace()

Lever une exception

Pour déclencher une exception, on utilise le mot clé throw. Il permet de lancer une exception en instanciant un objet sur une classe dérivée de la classe Exception.

throw new MonException("blabla");

 

Exemple d'implémentation d'une méthode qui génère une exception

    maMethode throws MaClasseException {

       if (condition_particuliere)

             throw new MaClasseException("Message d'erreur");

   }