TP
Gestion des exceptions en JAVA
Objectifs
-
S’initier à la capture et au traitement des
l’utilisation des blocs
exceptions par
try/catch.
- Tester
la
création
d’exceptions
personnalisées.
Temps alloué Outils
3h00
Eclipse
Exercice n°1 :
[Initiation au traitement des exceptions]
Soit le programme « ExceptionTest.java » suivant :
import java.util.Scanner;
public class exceptionTest {
public static void main(String[] args) {
int a, b, res;
Scanner clavier = new Scanner(System.in);
System.out.println("a =");
a = clavier.nextInt();
System.out.println("b =");
b = clavier.nextInt();
res = a / b;
System.out.println(a + " / " + b + " = " + res);
clavier.close();
System.out.println ("Fin du programme") ;
}
}
A première vue, le programme ne présente aucun problème (pas d’erreurs de compilation).
Seulement à l’exécution, vous vous apercevriez très vite que votre programme recèle une
faille gênante puisque nous n’avons pas vérifié que le diviseur n'est pas égal à zéro.
CHALOUAH.Anissa
1
1) Néanmoins, lancez le programme en saisissant une valeur nulle pour b.
Publicité
a. Le programme s'est-il exécuté correctement ?
b. Le message "Fin du programme" est-il apparu ?
c. Quelle exception a été levée par la machine Java ?
Nous allons maintenant faire en sorte que le programme ne se termine pas aussi
brutalement, et nous renseigne un peu plus. Pour cela, nous allons mettre en place un bloc
try/catch afin d'attraper l'exception levée précédemment
try {
res = a / b;
System.out.println(a + " / " + b + " = " + res);
}
catch( ArithmeticException e){
System.out.println("oops ! un problème dans la division");
System.out.println ("le message officiel est " + e.getMessage()) ;
}
Relancez le programme en saisissant une valeur nulle pour b.
d. Le programme a-t-il affiché qu'il y avait un problème dans la division ?
e. Le message "Fin du programme" est-il apparu ?
f. Quel est le message d'erreur officiel correspondant à une telle exception ?
A la suite de l'instruction catch vous allez maintenant rajouter le bloc finally suivant
finally {
System.out.println("le bloc finally sera toujours exécuté") ;
System.out.println("c'est là qu'on fermera par exemple les fichiers") ;
}
Relancerez le programme en saisissant encore une valeur nulle pour b.
g. Le bloc finally a t-il été exécuté ?
Mettez en commentaire le bloc catch et relancerez le programme en saisissant encore une
valeur nulle pour b.
h. Le bloc finally a t-il été exécuté ?
i. L'exception a t-elle été traitée ?
CHALOUAH.Anissa
2
Pour terminer, vous allez maintenant relancer le programme en saisissant une lettre à la
place d'un nombre
j. Que se passe-t-il ?
k. Quelle exception a été lancée ?
Corriger le problème en traitant l'exception lancée et en intégrant les lectures au clavier
dans le bloc try.
Exercice n°2 :
[Utilisation des Exceptions]
La méthode parseInt est spécifiée ainsi :
Publicité
public static int parseInt (String s) throws NumberFormatException
Parameters
Returns
Description
Exception
s - a String containing the int representation to be parsed
the integer represented by the argument in decimal.
Parses the string argument as a signed decimal integer.
The characters in the string must all be decimal digits,
except that the first character may be an ASCII minus
sign '-' to indicate a negative value.
NumberFormatException if the string does not contain a
parsable integer.
1) Utilisez cette méthode pour faire la somme de tous les entiers donnés en argument
de la ligne de commande, les autres arguments étant ignorés.
Exercice n°3 :
[Exceptions personnalisées et constructeurs]
Une adresse IP est une suite de 4 octets représentée de la manière suivante :
192.168.10.37
1) Écrire la classe adresseIP.java ayant comme attribut un tableau d’entiers nommé
octet.
2) Le constructeur de la classe adresseIP.java permet la création et l’initialisation du
tableau octet par 4 entiers (o1, o2, o3, o4) qui sont passés en paramètre au
constructeur.
CHALOUAH.Anissa
3
3) Redéfinir la méthode toString() de manière à ce qu’elle affiche l’adresse IP sous la
forme suivante : 192.168.10.37
4) Dans la méthode « main » créer une adresse IP et l’afficher.
Jusque-là normalement il n’y a pas de problème. Seulement, vous n’êtes pas sans savoir que
les octets représentant une adresse IP sont obligatoirement compris entre 0 et 255.
5) Vous allez donc mettre en place un traitement par exception pour éviter que l'on
puisse construire une adresse IP avec des nombres farfelus.
a. Pour cela, vous allez définir votre propre classe d'exception
« ExceptionAdrIP » dérivant de la classe de base Exception
b. Puis vous allez modifier le constructeur de la classe adresseIP de manière à
ce qu’il propage des exceptions de type « ExceptionAdrIP » lorsque l’un des
octets de l’adresse IP n’est pas compris entre 0 et 255.
c. Et enfin, vous mettrez en place dans la fonction main le traitement des
exceptions de type ExceptionAdrIP afin que lors de la levée d'une telle
Publicité
exception, l'erreur soit récupérée et le message indiquant l'octet faux soit
affiché.
Exercice n°4 :
[Exceptions personnalisées & traitement séparé]
Dans les failles de sécurité réseau, on trouve très souvent les problèmes de dépassement.
Par exemple, sur certaines anciennes versions de telnet, un login ou un mot de passe de plus
d'un mega-octet faisait "planter" le programme.
Cet exercice va gérer ce type de problème en séparant les exceptions pour une meilleure
gestion.
Parmi les exceptions que notre programme peut lever nous citons :
- WrongLoginException qui se produit lorsque l'utilisateur saisit un login incorrecte
- WrongPwdException lorsque le mot de passe est erroné
- WrongInputLength lorsque le login où le pwd saisi dépasse 10 caractères.
Remarque: La lecture de l'entrée standard peut lever une java.io.IOException.
CHALOUAH.Anissa
4
1) Implémentez les différentes classes d’exceptions de manière à ce que chacune affiche
un message d’erreur correspondant.
2) Notre classe principale nommée « Authentification » est caractérisée par :
a. Les constantes : LoginCorrect et PwdCorrect, deux chaines de caractères
initialisé à « scott » et « tiger » (celui-ci étant le seul utilisateur référencé dans
notre programme)
b.
Les méthodes : getUserLogin() et getUserPwd() qui permettent de lire à partir
du clavier le login et le password de l’utilisateur. Chacune de ces méthodes est
susceptibles de lever un ensemble d’exceptions que vous devez identifier.
c. Le constructeur de la classe « authentification » fait appel aux méthodes
précédemment énoncées pour lire le login et le mot de passe.
3) Implémenter la classe « TestAuthentification » intégrant la méthode « main() ». Cette
classe aura comme objectif la réalisation d’une authentification. Ce programme
tournera en boucle, tant que la création d’une nouvelle authentification est
incorrecte (capture d’exception).
NB : La gestion des exceptions doit être traité de façon judicieuse et avec la granulosité la
plus fine.
CHALOUAH.Anissa
5