TP sur les exceptions - première approche des collections - chaînes de caractères

Page Home (contact) Retour TPs

Support de cours


Exceptions dans les étagères

Travaillez avec les 2 classes Livre et Etagere.
  1. Dans la méthode ajouter de Etagere qui ajoute un livre sur l'étagère, enlevez le test qui vérifie que l'étagère n'est pas pleine. Lancez la méthode main de Etagere et notez les noms de l'exception levée. Remarquez le "2" qui suit le nom de l'exception qui indique la taille du tableau dans lequel on a voulu ajouter un élément avec un mauvais index. Etudiez aussi ce qui est affiché, avec les lignes qui ont conduit à l'exception. Il est important de bien lire les messages d'erreur pour corriger ensuite plus rapidement les erreurs.
  2. Mettez dans des blocs "try ... catch" les appels à la méthode ajouter en attrapant l'exception notée dans la question précédente. Faites afficher le message d'erreur "Etagère pleine" dans la méthode main qui appelle la méthode ajouter. Dans votre message d'erreur, ajoutez l'affichage de la pile des appels de méthodes qui a conduit à l'erreur (méthode printStackTrace() de Throwable). Testez. Remarquez que l'exception n'interrompt pas l'exécution puisque la description de l'étagère est bien affichée par la dernière instruction de la méthode main (l'affichage du message d'erreur peut être entremêlé avec l'affichage de la description mais la descritption est bien affichée).

Une classe pour les exceptions

Écrivez votre propre classe d'exception EtagerePleineException pour ce type d'exception. Cette exception sera une exception contrôlée par le compilateur.

Un attribut privé de cette classe sera une référence vers l'étagère qui a provoqué le problème. Ajoutez un getter pour cet attribut ; les méthodes qui utiliseront Etagere (en dehors de Etagere) pourront ainsi afficher des messages du type "Impossible d'ajouter un livre à cette étagère car elle ne peut contenir que 6 livres".

Récrivez la méthode ajouter pour qu'elle utilise cette nouvelle exception. L'exception doit être levée si on veut ajouter dans une étagère pleine. Comme on l'a vu dans le cours, il vaut mieux utiliser un if plutôt que d'attraper l'exception lancée jusqu'à maintenant. La méthode ajouter doit lancer l'exception EtagerePleineException (voir section suivante).

Modifiez la méthode main pour tenir compte de EtagerePleineException. Elle affichera le message d'erreur suivant : "Impossible d'ajouter un livre à cette étagère car elle ne peut contenir que xx livres". "xx" sera "2" pour ce cas particulier. La pile d'exécution ne sera plus affichée.

Comment et où faut-il traiter les exceptions ?

Les exceptions doivent être traitées par la méthode qui en sait assez pour prendre la bonne décision.

Par exemple, il serait mauvais de traiter le problème dans la méthode ajouter qui ne peut prendre la bonne décision : elle ne sait pas comment résoudre le problème si on lui dit d'ajouter un livre dans une étagère pleine. Elle laisse donc remonter l'exception à la méthode qui l'a appelée.

Pour illustrer cela, écrivez une classe Librairie. Cette classe a une variable d'instance etageres de type ArrayList<Etagere> qui contient une liste des étagères qui vont servir à ranger des livres. Quand une instance de la classe Librairie est créée, une étagère est ajoutée à la liste. Le nombre de livres que l'on peut ranger dans une étagère est rangé dans une constante (final) TAILLE_ETAGERES de la classe (fixez-la à 2 pour ne pas avoir à ajouter trop de livres pendant les tests).

Pour créer une instance d'une telle liste : ArrayList<Etagere> etageres = new ArrayList<>();

Pour ajouter une étagère dans une telle liste : etageres.add(etagere);

Pour avoir la dernière étagère de la liste (l'étagère qui a été ajoutée le plus récemment) : etageres.get(etageres.size() - 1). La valeur etageres.size() retourne le nombre d'éléments dans la liste et les éléments de la liste sont numérotés de 0 à size() - 1.

La classe Librairie possède une méthode ajouterLivre qui ajoute un livre dans les étagères. Si la dernière étagère ajoutée dans la liste est pleine alors que l'on veut ajouter un livre on crée une nouvelle étagère, on l'ajoute dans la liste des étagères et on ajoute le livre dans cette étagère.

La classe Librairie a une méthode afficheLivres qui affiche tous les livres qui ont été ajoutés.

Pour tester vous ajouterez au moins 7 livres. Vous appellerez ensuite afficheLivres.

Correction :

Classe Librairie
Classe Etagere
Classe EtagerePleineException


Une entreprise, collection d'employés

  1. Écrivez une classe Entreprise. Une entreprise a un nom et a des employés que vous enregistrerez à l'aide d'un ArrayList<Employe>. Utilisez cette classe Employe. Il devra être possible d'ajouter et d'enlever des employés dans une entreprise. Utilisez une classe d'exception EmployeException (toute simple, avec seulement des constructeurs) pour les cas où, par exemple, on veut ajouter un employé dans une entreprise alors qu'il y est déjà ou bien enlever un employé dans une entreprise dans lequel il ne travaille pas.
  2. Vous écrirez une méthode toString qui décrit une entreprise en affichant son nom et les noms de tous ses employés (parcourez l'ArrayList et utilisez un StringBuilder pour ajouter une description de chaque employé).
  3. Pour tester, ajoutez quelques employés dans 2 entreprises et faites afficher les noms des entreprises et de leurs employés. Vous pourrez tester la classe avec cette classe TestEntreprise.

Correction :

Classe Entreprise
Classe EmployeException

Palindromes (chaînes de caractères)

Cet exercice est optionnel.

Élu par cette crapule.
Ésope reste ici et se repose.
Tu l'as trop écrasé, César, ce Port-Salut...
Ca vous dit quelque chose ? Ce sont des palindromes : ils peuvent être lus de la gauche vers la droite ou de la droite vers la gauche (on ne tient pas compte de la ponctuation, des accents ou des espaces blancs).

Écrivez une classe Palindrome qui sera utilisée pour savoir si une phrase est un palindrome. Cette classe comportera plusieurs méthodes qui indiqueront si une chaîne de caractères (String) donnée en paramètre est un palindrome ou pas :

  1. La méthode "boolean palindrome1(String)" prend en paramètre une chaîne constituée uniquement de lettres minuscules ou majuscules (pas d'espaces ni de lettres accentuées). Elle renvoie vrai si le paramètre est un palindrome. On tient compte de la casse des lettres (abBA n'est pas un palindrome). Vous comparerez les lettres une à une.
  2. La deuxième version de la méthode palindrome1, nommée palindrome2 utilise la méthode reverse() de la classe StringBuilder.
  3. La méthode palindrome3 généralise palindrome1: le paramètre peut comporter autre chose que des lettres (des signes de ponctuation par exemple) mais on n'en tient pas compte.
  4. La méthode palindrome4 généralise  palindrome3 : un deuxième paramètre indique si on tient compte de la casse des lettres. Ce deuxième paramètre devra être optionnel. Par défaut, les majuscules et minuscules ne seront pas considérées comme équivalentes.
  5. Généralisez palindrome4 en palindrome5 : en plus, les lettres accentuées sont considérées équivalentes aux lettres non accentuées ; par exemple, e, ê, è et é sont équivalentes. Comme palindrome4, palindrome5 a un paramètre optionnel pour ignorer la casse des lettres. Dans le cas où elle est ignorée, E, È, Ê et É sont équivalentes à e, è, ê et é.

Correction

Classe Palindrome


Pour ceux qui ont déjà fini....

Dans l'exercice sur les entreprises, un employé peut être engagé par plusieurs entreprises. Sans changer le code de la classe Employe, arrangez-vous pour qu'il ne soit pas possible d'ajouter un employé dans plusieurs entreprises. Si un employé est ajouté dans une entreprise, il est automatiquement retiré de son ancienne entreprise (s'il travaille déjà dans une entreprise). Pour cela, conservez dans la classe Entreprise une liste de toutes les entreprises. Au moment d'engager un employé dans une entrerprise, vérifiez qu'aucune entreprise ne l'emploie déjà ; sinon, retirez-le de cette ancienne entreprise.

TestEntreprise
Entreprise

Un peu de lecture sur les exceptions dans le tutoriel d'Oracle (lisez en particulier cette page : http://download.oracle.com/javase/tutorial/essential/exceptions/runtime.html)


Classe Collator pour comparer des chaînes de caractères "localisées"

Reprenez l'exercice sur les palindromes en utilisant la classe java.text.Collator.


Retour TPs