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, renvoyerpublicLogLine 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
PasTrouvequi hérite de la classe Exception (déjà connue de Java).
Mettez-y un attributcontenude 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(newPasTrouve("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 :publicLogLine 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
bidonde 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
throwsdans l'en-tête de chaque méthode ?