Attraper une exception

           

Nous montrons ici comment se propage une exception et comment on peut attraper une exception qui se propage.

Lorsqu'une exception est lancée, elle va se propager de la façon décrite ci-dessous. Nous supposons que l'exception est lancée par une certaine instruction I (instruction qui peut ressembler à if (...) throw new Exception...();, en supposant qu'à l'exécution, la condition du if est vérifiée) d'une méthode de nom uneMethode. L'explication que nous donnons est récursive.

Si une exception est lancée et pas attrapée, et donc qu'elle provoque la terminaison du programme (plus exactement du thread en cours d'exétion), la pile des méthodes traversées par l'exception est indiquée à l'utilisateur.

Une méthode susceptible de lancer une exception sans l'attraper par le mécanispe try-catch (c'est-à-dire contenant une instruction susceptible de lancer une exception sans que celle-ci soit attrapée à l'intérieur de la méthode) doit l'indiquer dans son en-tête, nous verrons la syntaxe correspondante dans un prochain exemple. Néanmoins, on est dispensé d'indiquer la possibilité de lancement des exceptions les plus courantes, comme par exemple java.lang.ArrayIndexOutOfBoundsException ou bien java.lang.ArithmeticException.

Examinons l'exemple ci-dessous. L'objectif est d'écrire une méthode moyenne qui calcule la moyenne d'entiers reçus en paramètre par un tableau de chaînes de caractères. Les chaînes ne représentant pas un entier (et donc erronées) doivent être ignorées ; l'utilisation des exceptions nous permet ici d'indiquer à l'utilisateur les chaîne erronées. Une méthode main dans la classe EssaiAttrape permet de tester la méthode moyenne. La moyenne calculée est en fait la valeur entière par défaut de la moyenne exact.


public class Attrape {
  public static int moyenne(String[] liste) {
    int somme = 0, nbEntiers = 0;
    
    for (String chaine : liste) {
	try {	    
	    somme += Integer.parseInt(chaine);
	    nbEntiers++;
	  }
	catch (NumberFormatException e) {
	    System.out.println(chaine + " n'est pas entier");
	  }
      }
    return somme/nbEntiers;
  }
}

class EssaiAttrape {
  public static void main(String[] arg) {
    System.out. println("La moyenne est " + Attrape.moyenne(arg));
  }
}
Pour : java Essaittrape ha 15 12
on obtient en sortie
ha n'est pas entier
La moyenne est 13
et pour : java EssaiAttrape ha 15.5
ha n'est pas entier
15.5 n'est pas entier
java.lang.ArithmeticException: / by zero
        at Attrape.moyenne(ExceptionCatch.java:14)
        at EssaiAttrape.main(ExceptionCatch.java:17)

Pour accéder au fichier Attrape.java.


Integer.parseInt(chaine); : si la chaîne de caractères chaine ne correspond pas à un entier, la méthode parseInt appliquée à chaine lance une exception de type NumberFormatException au moment où le fait que chaine ne représente pas un entier est reconnu ; la méthode parseInt ne se termine pas, ne renvoie rien ; la méthode moyenne relance cette exception à l'endroit de l'appel à la méthode parseInt, l'affectation somme += ... n'est pas effectuée ainsi que l'instruction qui suit : nbEntiers++. L'exception est attrapée par le bloc catch : l'instruction System.out.println(chaine + " n'est pas entier") intérieure au bloc catch s'exécute ; le programme reprend son cours normal, il remonte dans la boucle for qui continue son déroulement.
somme += Integer.parseInt(chaine); : cette opération est évalente à :
    somme = somme + Integer.parseInt(chaine);
somme/nbEntiers : si nbEntiers vaut 0, une exception de type java.lang.ArithmeticException est lancée. Celle-ci n'étant pas attrapée, elle se propage alors jusqu'à la fin du programme, comme on peut le constater sur le second exemple d'exécution. La pile des méthodes traversées par l'exception est affichée à l'écran : ici l'exception est lancée à partir de la méthode moyenne de la classe Attrape puis est reçue par la méthode main de la classe EssaiAttrape qui la propage à son tour. On peut remarquer que la machine virtuelle a exploité le fichier source pour indiquer les lignes du fichier source par où est passée l'exception.

© Irène Charon Télécom ParisTech 2010