Exceptions (Exemple 2)

Même exemple que précédemment, mais on gère aussi le fait que \Delta = b*b-4*a*c peut être négatif. On crée alors une exception spécifique ErreurDeltaNegatif qui va gérer le fait que dans le cas d'un nombre négatif, Math.sqrt renvoie NaN (sans générer d'erreur).

Recherche des racines d'un polynome du second degre (version 2):

/*

 * Main.java
 *
 * Recherche des solutions de l'equation f(x) = 0
 * pour f(x) = ax**2+bx+c
 */

package exception2;

/**

 *
 * @author gmonard
 */

class Polynome_second_degre
{
    private double a; // les trois reels definissant un polynome du second degree
    private double b; // de type ax**2+bx+c
    private double c;

    public Polynome_second_degre(double a, double b, double c)
    {
        this.a = a;
        this.b = b;
        this.c = c;
    }

    // accesseurs pour a, b, et c (vive le copier-coller ...)
    public double geta() {return this.a;}
    public double getb() {return this.b;}
    public double getc() {return this.c;}
    public void seta(double a) {this.a = a;}
    public void setb(double b) {this.b = b;}
    public void setc(double c) {this.c = c;}

    // calcul du delta = b^2-4ac
    private double delta()
    {
        double delta;
        delta = b*b-4.*a*c;
        return delta;
    }

    public double getSolution1() throws ErreurDeltaNegatif
    {   
        double solution;
        double sqrtd = Math.sqrt(delta());
        if (Double.isNaN(sqrtd))
        {
            ErreurDeltaNegatif edn = new ErreurDeltaNegatif(delta());
            throw edn;
        }
        solution = (-b-Math.sqrt(delta()))/(2.*a);
        return solution;
    }
    public double getSolution2() throws ErreurDeltaNegatif
    {
        double solution;
        double sqrtd = Math.sqrt(delta());
        if (Double.isNaN(sqrtd))
        {
            ErreurDeltaNegatif edn = new ErreurDeltaNegatif(delta());
            throw edn;
        }
        solution = (-b+Math.sqrt(delta()))/(2.*a);
        return solution;
    }

}

/* pour creer sa propre exception, il suffit d'heriter de Exception

 */
class ErreurDeltaNegatif extends Exception
{
   /* deux contructeurs sont importants à définir

    */
    public ErreurDeltaNegatif()
    {
        System.out.println("ErreurDeltaNegatif");
    }
    public ErreurDeltaNegatif(String message)
    {
        super(message);
    }
    /* un troisieme peut etre interessant 

     */
    public ErreurDeltaNegatif(double delta)
    {
        super("ErreurDeltaNegatif");
        System.out.printf("Delta = %f\n", delta);
    }
}

public class Main {

    /** Creates a new instance of Main */
    public Main() {
    }

    /**

     * @param args the command line arguments
     */
    public static void main(String[] args) {
        /* lecture de a, b et c par la ligne de commande

         */
        double a;
        double b;
        double c;
        RuntimeException nombre_arguments = new RuntimeException("Nombre d'arguments incorrects");
        NumberFormatException type_arguments = new NumberFormatException("Type d'argument incorrect: n'est pas un nombre");

        // verification de la presence de 3 arguments
        if (args.length != 3)
        {
            throw nombre_arguments;
        }

        // on recupere les arguments et on les convertit en double
        try { a = Double.parseDouble(args[0]); }
        catch (NumberFormatException nfe) { throw type_arguments;}
        finally { System.out.println("Argument lu: "+args[0]); }

        try { b = Double.parseDouble(args[1]); }
        catch (NumberFormatException nfe) { throw type_arguments;}
        finally { System.out.println("Argument lu: "+args[1]);}

        try { c = Double.parseDouble(args[2]); }
        catch (NumberFormatException nfe) { throw type_arguments;}
        finally { System.out.println("Argument lu: "+args[2]);}

        Polynome_second_degre p = new Polynome_second_degre(a, b, c);
        try
        {
            System.out.printf("Solution 1: %f\n", p.getSolution1());
            System.out.printf("Solution 2: %f\n", p.getSolution2());
        }
        catch (ErreurDeltaNegatif edn)
        {
            System.out.println("Pas de solution reelle");
            System.out.printf(edn.getMessage());
        }

    }

}