Mission
- Exploiter l'information contenue dans les logs en jouant avec les exceptions.
- Vocabulaire à connaître à l'issue du TD : exception, try catch, throw
- Dans la classe Logs, définissez une méthode permettant de trouver la ligne la plus récente impliquant les deux robots passés en argument :
Si aucune ligne ne correspond, renvoyerpublic
LogLine trouveLigne(Robot emetteur, Robot tiers)null
. - Dans la classe Robot, ajouter une méthode
direBonjour(Robot autre)
qui, en utilisant le log des collisions, affichera l'un des messages suivants :Bonjour, on ne se connaît pas.
Rebonjour, on s'est déjà croisé le (puis la date de la dernière rencontre)
- Tester en invoquant direBonjour dans chaque méthode
collision
. - Créez une nouvelle classe
PasTrouve
qui hérite de la classe Exception (déjà connue de Java).
Mettez-y un attributcontenu
de type String, et un gentil constructeur. C'est tout. - Dans la méthode
trouveLigne
, quand aucune ligne ne correspond à la requête, au lieu de renvoyernull
, lever l'exception PasTrouve de la manière suivante (choisir un message adéquat) :throw
(new
PasTrouve("message")) ;
Essayer de compiler. Le compilateur vous signale une erreur, c'est normal.
En Java, lorsqu'une exception menace d'être levée, il faut la signaler dans la déclaration de la méthode, comme ceci :public
LogLine trouveLigne(...)throws PasTrouve
C'est maintenant la méthode direBonjour qui embête le compilateur : comme elle fait appel à la méthode trouveLigne qui risque de lever l'exception PasTrouve, il faudrait aussi signaler l'exception PasTrouve dans la déclaration de direBonjour (on peut remonter comme ça jusqu'à la méthode main).
Au lieu de faire remonter l'exception, on va l'attraper au vol :try
{ ...(bloc contenant un appel à trouveLigne)... }catch
(PasTrouve e) { ...(ici ce qu'il faut faire si l'exception a été levée par trouveLigne)... }En général, une exception indique quelque chose d'anormal (par exemple, un fichier introuvable ou un débordement de buffer).Questions de compréhension
- Trouver l'exception levée lorsque l'on fait POP sur une pile vide.
- Dans la classe Robot, ajoutez un attribut
bidon
de type Robot. Ne l'initialisez pas dans le constructeur. Dans l'une des méthodes, appelez explose sur l'attribut bidon. Compilez.
D'après vous, que va-t-il se passer à l'exécution ? Observez ce qui se passe. - Pourquoi l'exception NullPointerException n'est elle pas déclarée avec
throws
dans l'en-tête de chaque méthode ?