Lancer une exception                        

Lancer une exception

           

L'objectif de l'exemple est le même que celui de l'exemple sur sur la façon d'attraper une exception : il s'agit 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. Néanmoins, on veut de plus que la méthode moyenne lance une exception de type ExceptionRien si aucune chaîne de caractères n'est valide afin d'éviter la division pr zéro. Une méthode main dans la classe EssaiLance permet de tester la méthode moyenne dela classe Lance.

public class Lance {
   static int moyenne(String[] liste) throws ExceptionRien {
      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");
	  }
      }
      if (nbEntiers == 0) throw new ExceptionRien(liste.length);
      return somme/nbEntiers;
   }
}

class EssaiLance {
   public static void main(String[] arg) {
      try {
	  System.out.println("La moyenne est " +  Lance.moyenne(arg));
      }
      catch (ExceptionRien e)  {
	    e.printStackTrace();
     }
   }
}
Pour : java ExceptionThrows ha 15.5, on obtient :
ha n'est pas entier
15.5 n'est pas entier
ExceptionRien : aucune des 2 chaines n'est valide
        at Lance.moyenne(Lance.java:15)
        at EssaiLance.main(Lance.java:23)

Pour accéder au fichier Lance.java.


throws ExceptionRien : la méthode moyenne indique ainsi qu'il est possible qu'une de ses instructions envoie une exception de type ExceptionRien sans que celle-ci soit attrapée par un mécanisme try-catch. Il est obligatoire d'indiquer ainsi un éventuel lancement d'exception non attrapée, sauf pour les exceptions les plus courantes de l'API. Si vous oubliez de signaler par la clause throws l'éventualité d'un tel lancement d'exception, le compilateur vous le rappelera.
throw new ExceptionRien(liste.length) : on demande ainsi le lancement d'une instance de ExceptionRien en lui donnant comme paramètre le nombre de chaînes du tableau traité. Une fois lancée, l'exception se propagera comme expliqué dans l'exemple précédent. Ici, l'instruction :
    return somme/nbEntiers;
n'est pas exécutée, la méthode moyenne se termine, on se retrouve alors à l'appel de la la méthode moyenne dans le main, la concaténation dans le paramètre de la méthode println n'est pas calculée, la méthode println n'est pas utilisé, le bloc try dans la méthode main se termine ; le bloc catch qui suit attrape les ExceptionRien(s) : l'instruction de ce bloc catch est effectuée. Le programme reprend alors son cours normal (pour se terminer).
e.printStackTrace(); : la méthode printStackTrace est héritée de la classe java.lang.Throwable (on rappelle que la classe ExceptionRien hérite de la classe java.lang.Exception qui hérite de la classe java.lang.Throwable). Cette méthode écrit sur la sortie standard d'abord l'exception e grâce à sa méthode toString, puis la pile des méthodes traversées pas l'exception, comme on peut le voir sur la sortie de l'exemple.

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