Les sources de la solution sont disponibles [ ici ].
Les commentaires :
rencontre impossible et/ou infertile :
- La "difficulté" principale de l'exercice 2 est de déterminer comment écrire/modifier les deux classes d'exception demandées.
- La solution consiste à concevoir les exceptions comme étant capable de déterminer elles-mêmes le message associé à l'exception.
- C'est pour cela que les deux classes ont comme attribut 2 humains. Elles ont ainsi accès aux attributs des humains et peuvent déterminer quels sont les problèmes empêchant d'avoir un nouvel humain.
- C'est donc en redéfinissant getMessage() dans ces classes et en utilisant les attributs des deux humains que l'on va pouvoir déterminer ce que renvoie getMessage().
- Le fait que tous les cas problématiques génèrent une exception permet de modifier le moteur de jeu avec dans le bloc try :
- l'appel à rencontre()
- l'insertion du nouvel humain dans la population.
- En effet, si la méthode rencontre() ne génère pas d'exception, cela veut forcément dire qu'un nouvel humain a été créé et peut donc être inséré dans la population.
Une super-classe pour les exceptions de rencontre.
- La solution nécessite de modifier les 2 classes créées précédemment afin qu'elles héritent de MeetingException.
- De plus, il faut modifier les signatures de toutes les méthodes de rencontre. Pour cela, il y a 2 solutions :
- compléter la liste des exception potentiellement générées, i.e. écrire : throws BreedingForbiddenExcpetion, NoBreedingException
- faire appel au polymorphisme, i.e. écrire : throws MeetingException
- C'est la 2ème solution qui est la plus POO et qui est utilisée dans cette solution.
la propagation des exceptions
- NB : la solution proposée diffère de ce qui est indiqué dans l'exercice, en prenant en paramètre non pas deux indices mais deux humains.
- C'est à cause de l'organisation du moteur de jeu dans LifeGame, où l'on utilise la méthode setCouple() pour récupérer directement 2 humains et pas leur indice.
- Cela n'a pas d'influence sur la solution.
- En effet, le problème de compilation vient du fait que la méthode rencontre() de Population fait appel à la méthode rencontre() de Homme/Femme.
- Or, celle-ci génère potentiellement une MeetingException.
- 2 solutions pour supprimer l'erreur de compilation :
- faire un try/catch dans la méthode rencontre() de Population.
- propager explicitement l'exception qui peut se produire.
- C'est la deuxième solution qui est demandée et elle consiste à simplement ajouter throws MeetingException à la signature de rencontre() dans Population.