tete du loic

 Loïc YON [KIUX]

  • Enseignant-chercheur
  • Référent Formation Continue
  • Responsable des contrats pros ingénieur
  • Référent entrepreneuriat
  • Responsable de la filière F2 ingénieur
  • Secouriste Sauveteur du Travail
mail
loic.yon@isima.fr
phone
(+33 / 0) 4 73 40 50 42
location_on
ISIMA
  • twitter
  • linkedin
  • viadeo

local_cafe Cinquo local_cafe

Date de première publication : 2024/09/23

Utiliser une exception

Adaptez le code suivant :


String s = System.console().readLine();
int i =1;
while (!s.isEmpty()) {
   System.out.println(i++ +": "+s);
   
   s = System.console().readLine();
}

avec une analyse de la saisie :


double d = Double.parseDouble(s);

pour permettre un calcul d'une somme...

La méthode console() peut renvoyer null. Dans ce cas-là, n'exécutez pas votre code dans un EDI ou alors utilisez un Scanner.

Gérer ses propres exceptions

Code initial et premières manipulations

L'auvergnat apprécie tout ce qui lui permet d'être économe. Penchons-nous sur la classe CompteBancaire vue en cours...

public class CompteBancaire {
  private double solde = 0.0;       // solde du compte
  private double decouvert = -700.; // découvert autorisé

  public void retrait(double montant) {
    double nouveau = solde - montant;
    if (montant<0.0) 
      System.out.println("Mauvais montant");
    else if (nouveau<decouvert) 
      System.out.println("Operation impossible : le compte serait trop debiteur");
    else solde = nouveau;
  }
}

La première étape est d'ajouter une méthode main() à la classe CompteBancaire et d'instancier la classe. Vous pouvez ajouter une méthode toString() ou un getter pour connaître la valeur du solde du compte et proposer un constructeur pour changer la valeur initiale du compte.

La classe telle qu'elle est présentée affiche un message d'erreur sur la sortie standard en cas de pépin. Nous pourrions gérer les cas exceptionnels avec le type de retour de la méthode mais rien n'empêche l'utilisateur de s'assoir sur l'erreur alors dans un souci de transparence, nous allons utiliser le mécanisme des exceptions.

Retrait d'un montant négatif

Nous allons tout d'abord utiliser une exception de la plateforme Java lorsque le paramètre fourni à la méthode retrait() est négatif.

throw new IllegalArgumentException("Mauvais montant");

La ligne précédente permet de faire deux choses : instancier une nouvelle exception et la jeter : nous utilisons alors le mécanisme de gestion des exceptions.

À la compilation, vous n'obtenez pas d'erreur pourtant l'exception est levée si le montant est négatif !

Ce comportement n'est pas souhaité, on aimerait que le compilateur nous dise que la méthode retrait() lève une exception. En fait, l'exception IllegalArgumentException est une "unchecked exception" (elle dérive de RuntimeException) et n'a pas vocation à être utilisée comme on voudrait le faire.

Essayez maintenant :

throw new Exception("Mauvais montant");

Le compilateur réagit maintenant à la non prise en compte de l'exception et il faut alors un try-catch ou alors il faut relancer l'exception.

On peut donc dire que l'on a réussit à utiliser le système des exceptions même si la bonne manière de procéder est de créer une classe dédiée à l'erreur : MontantNegatifException qui dérive de java.lang.Exception , ce que l'on va faire pour l'erreur au prochain paragraphe.

Solde de compte trop négatif

On vous propose de gérer le cas où le solde devient trop négatif en jetant une instance d'AutorisationException où AutorisationException est une exception personnalisée (une classe dérivant d'une exception, au pire java.lang.Exception).

Code du cours

Pour info, voilà la classe telle qu'elle a été donnée plus ou moins dans le support de cours :

Et voilà !

public class CompteBancaire {
  private double solde = 0.0;       // solde du compte
  private double decouvert = -700.; // découvert autorisé


  public void retrait(double montant) 
   throws MontantNegatifException, AutorisationException {
    double nouveau = solde - montant;
    if (montant<0.0) 
      throw new MontantNegatifException();
      // eventuellement throw new Exception("mauvais montant");
    if (nouveau<decouvert) 
      throw new AutorisationException();
    solde = nouveau;
  }
}

Comme nous l'avons vu en cours, le mécanisme des exceptions est complètement intégré au langage : il permet d'avoir un code sécurisé et de faire une gestion des cas exceptionnels très propre et surtout de respecter le principe de génie logiciel objet à savoir ne pas appliquer la politique de l'autruche sur les erreurs potentielles à l'exécution.