TP JAVA 3 ( exceptions )

Partie 1 : Les exceptions

Les exceptions (cours)

Avant de commencer : Voir le rappel de cours

Exercice 1 : Capter et Gérer les exceptions

Tester l’exercice sur les exceptions vu en cours (nommé « TestException »).

Le fichier source est ici

Vérifiez ce qui va être affiché à l'écran si on lance le programme avec les arguments suivant:

TestException 4 2 7 5 1 6 3

 

Exercice 2

Soit la classe suivante dont le main attend un argument :

class Factorielle

{

  public static void main (String[] args)

   {

     int i, nbEntiers=0, factorielle=1;

     int ancien;

  

        nbEntiers= Integer.parseInt(args[0]);

        for (i=2;i<= nbEntiers;i++)

          {

            ancien=factorielle;

            factorielle *= i;

           }

         System.out.println(" Voila la factorielle des "+ nbEntiers +

                   " premiers entiers : "+ factorielle );

    }

}

 

A/ Compilez et exécutez le programme Factorielle.java ci-dessus en essayant successivement:

 

  1. de ne pas passer en ligne de commande le paramètre attendu. Que se passe t’il ?
  2. de mettre un paramètre non-entier. Que se passe t’il ?
  3. de mettre un paramètre entier négatif. Que se passe t’il ?

 

B/ modifier le programme pour que, dans chacun des cas, un message d’erreur en français soit indiqué à l'utilisateur.

 

Dans le cas 1, on souhaite que le programme affiche par exemple:

Donnez en paramètre la base de la factorielle

 

Dans le cas 2, on souhaite que le programme affiche par exemple:

La base de la factorielle doit être ENTIERE

 

et dans le cas 3, si le paramètre indiqué est -4 par exemple:

-4 est négatif: la factorielle d'un nombre négatif n'est pas definie

 

C/ Proposer une solution pour que le message du cas 3 soit affiché dans le bloc catch du cas 2

 

N.B: Vous pouvez afficher le message de l'exception en utilisant la méthode getMessage() :

System.out.println(variableException.getMessage());

 

Exercice 3 : Capter et Gérer les exceptions (MonEntier)

 

A/ Créez une classe d'objet MonEntier qui contient une propriété « val » de type int. Ecrivez le constructeur de cette classe qui initialise correctement l’objet.

 

B/ Ajoutez à cette classe la méthode division().

Cette méthode retourne le résultat (int) de la division entière de la propriété val d'un objet MonEntier par la propriété val d'un autre objet MonEntier qu’on appelera « diviseur ». L'objet diviseur sera passé en paramètre de la méthode division.

Ajouter dans la méthode division() un message indiquant « division de X par Y » avant l’opération.

 

C/ Créez une méthode main() créant deux entiers quelconques à partir des paramètres de la ligne de commande, et appeler la méthode division avec ces 2 valeurs en affichant le résultat retourné. Que se passe-t-il avec un diviseur égal à zéro? (La division par zéro crée une ArithmeticException, vérifiez).

 

D/ Dans la méthode division: testez (try) le bloc qui effectue l'opération. Si une ArithmeticException est générée, affichez le message "Division impossible".

 

N.B: Vous pouvez afficher le message de l'exception en utilisant la méthode getMessage() :

System.out.println(variableException.getMessage());

 

E/ Commentez le bloc try de la question D. Déplacez le bloc try {} catch{} dans la méthode main. Comment doit il être placé ?

 

F/ Proposez une modification pour que le message "Division effectuée" soit affichée à l’écran qu’il y ait eu une erreur ou non. Quelles sont les 3 possibilités ?

 

Exercice 4 : exception personnalisée (pile)

 

Soit le programme suivant Pile.java :

 

import java.util.Vector;

 

class Pile {

        Vector data=new Vector();

                       

        void push(Object o)

        {

                        data.addElement(o);

        }

        Object pop()

        {      

                Object sommet=null;

                sommet=data.lastElement();

                data.removeElement(sommet);

                return sommet;

        }

       

        public static void main(String args[])

        {

             Pile s=new Pile ();

               

             s.push(new String("FIN"));

             s.push(new Integer(5));

             s.push(new Float(10.7f));

             s.push(new Double(20.5));

             s.push(new String("DEBUT"));

 

             System.out.println(" voici le contenu de la pile");

             System.out.println("element1 : "+ s.pop());

             System.out.println("element2 : "+ s.pop());

             System.out.println("element3 : "+ s.pop());

             System.out.println("element4 : "+ s.pop());

             System.out.println("element5 : "+ s.pop());

             System.out.println("element6 : "+ s.pop());

        }

}

 

A/ Compilez et exécutez le programme. Vous devez constater une erreur : vérifiez la propagation de l'exception dans la pile d’appel du programme.

Dans la méthode main, utilisez un bloc try/catch: affichez le message d'erreur "il n'y a plus d'élément dans la pile".

 

Pour un rappel sur la création d’exception: Voir le rappel de cours

 

B/ Créez l'exception PileVideException qui hérite de la classe Exception (N'oubliez pas les constructeurs)

 

C/ La méthode pop() est la méthode qui génère l'exception. Indiquez dans son en-tête que cette méthode génère une exception du type PileVideException.

 

Dans la méthode pop(), tester si la pile est vide, à l'aide de la méthode isEmpty() de la classe Vector. Si la pile est vide, alors levez une nouvelle exception du type PileVideException. Indiquez dans le message d'erreur: "ERREUR: La pile est vide !"

D/Dans la méthode main, testez dans le bloc try les appels à la méthode pop. Captez l'exception PileVideException dans un bloc catch, et vous affichez le message d'erreur correspondant.

 

E/ Proposez une variante de la méthode pop() qui lève toujours une exception du type PileVideException mais sans utilisation d’instruction conditionnelle ( PAS DE IF ).