Javaquarium

4 ans et 3 mois après, il est toujours là, et toujours aussi difficile !

a marqué ce sujet comme résolu.

Hello, j'ai commence a developper cet exercice mais je suis coince au don de naissance car je me retrouve face a une erreur de null pointer reference que je n'arrive pas a resoudre.

Je dois avouer que je suis plutot mauvais pour trouver mes erreurs … voici mon repertoire github si jamais des gens sont interesses :https://github.com/Zboub/Javaquarium

merci d'avance

Je n'ai pas identifier ton problème mais j'ai vu quelques truc qui me font poser des questions. Je suis pas un expert objet mais bon !

Dans EtreVivant du defini mkebaby() (d'ailleurs j'ai eu du mal a le trouver, faudrait revoir l'organisation des class abstract). Tu le specifie dans algue, normal. Mais pas dans poisson, aah si ! Dans poisson carnivore et poisson herbivore, pourquoi? Tu aurais eu des particularité pourquoi pas, mais en utilisant une factory pour la creation des poisson, puisqu'il n'y a que le "type" qui change, je trouve que d'un point de vue objet vaut mieux faire la factory ! Tu pourras plus facilement rajouter des types debpoisson en plus.

Si ca se trouve je viens de raconter une connerie, my bad :x

Sinon deuxieme chose, ta fonction compute dans aquarium est juste trop longue, tu devrais la diviser un peu en fonction. Quand t'es seul ca va mais j'ai chercher pendant 2 minutes ou tu faisais les bebe ^^.

Pour ton probleme il faudrait en dire un peu plus sur l'endroit par exemple.

Derniere chose, faire une declaration avec un "= null" ca revient a ne rien mettre, si tu ne le savais pas :)

Si si je peux t'envoyer le message d'erreur mais le probleme c'est que de 1 elle ne se produit pas a chaque fois et deuxiemement quand je supprime la ligne qui pose probleme, elle se produit sur la ligne juste au dessus qui n'est que la declaration d'une boucle for …

Exception in thread "main" java.lang.NullPointerException at Aquarium.computeTour(Aquarium.java:77) at Main.main(Main.java:91)

la ligne 77 de Aquarium etant :

1
if(m_fishes.get(i).isAlive())

et la ligne au dessus :

1
for(int i = 0; i < m_fishes.size(); i++)

Je crois avoir trouver ton erreur ! Tu fais un for et pas un while ! Il m'est arrivé la meme chose. Je peux pas te donner d'exemple je suis sur mon tel mais j'editerais une fois sur l'ordi.

En gros le compilateur quand il voit un for il remplace le m_fishes.size() par une valeur contante. Donc si cette valeur change tu l'as profond. Tu es obliger de faire un while si ta limite change. Je n'ai jamais compris pourquoi mais bon..

Du coup tu finis par sortir du tableau quand tu as supprimer un poisson.

Si ca se trouve j'ai raconter une betise xD

Sinon, essaie de faire un peu de menage et redecouper, tu pourras rajouter plus facilement des choses et ca restera lisible, on dit souvent qu'une fonction c'est 25 lignes. Dans certaines ecoles ils t'enlevent 0,5 point par ligne supllementaire.. C'est too much mais c'est l'idee ;)

+0 -0

on dit souvent qu'une fonction c'est 25 lignes. Dans certaines ecoles ils t'enlevent 0,5 point par ligne supllementaire.. C'est too much mais c'est l'idee

Seule l'EPITECH mets une limite aussi ridiculement basse à ma connaissance. Merci de ne pas en faire une généralité :)

Cela dit, c'est vrai que la l'organisation et la forme sont améliorable. Mais avoir un programme fonctionnel est prioritaire.

Heu j'avoue que faire des fonctions trop longues c'est inutile voir ça nuit à la lisibilité du code mais cette règle des 25 lignes puis -0.5/l c'est totalement con :)

Bon du coup dès que j'ai le temps je change la boucle for par une while (merci pour le conseil j'aurai franchement jamais trouvé parce que c'est bien la première fois qu'on me met en face de ce problème, pourtant j'ai déjà codé dans d'autres langages mais il me semble que c'est bien spécifique à Java cette histoire).

Au passage je suis preneur de tous conseils pour améliorer mon code. Il me semblait l'avoir déjà pas mal factorisé mais comme dit je suis pas un expert Java loin de là donc si vous avez des critiques, faîtes vous plaisir. De même je suis loin de maîtriser toutes ces histoires de classes abstraites donc il y a peut-être mieux à faire et là encore je suis preneur de tous les avis pour m'améliorer (sinon à par ce côté optimisation et l'erreur de null reference le code a l'air de tourner correctement pour le moment).

EDIT :

m_fishes qui ne serait pas initialisé ?

(tu peux aussi ouvrir un sujet si tu as besoin d'un coup de main, comme ca on garderait celui-ci propre pour >parler de l'aquarium :) )

En fait m_fishes est initialisée dans le main, en gros je mets automatiquement un certain nombre de poisson dès le début parce que ça me gave de les rajouter à chaque fois pour tester 3 lignes :) mais si il est bien initialisé car comme dit parfois l'erreur de null pointer n'intervient qu'au 5ème tour.

Pour info j'ai commencé à bosser sur le Groovyquarium hier soir rapidement, et ça prend forme. Je vais continuer à fouiller pour trouver le moyen le moins laid pour gérer la sexualité des poissons.

On pourrait presque s'en servir de base pour un cours sur le site. En tout cas j'essaie de garder ça en tête.

+0 -0

De toute façon, plus une fonction est longue, plus elle contient de chemins d'exécution, plus elle est compliquée à comprendre, plus elle est dure à debugger (et on ne parlera pas de la prouver ;) ). Si on applique le SRP à la lettre (et généralement pour la partie "avoir un programme qui marche", c'est pas dommage), les fonctions sont naturellement courtes.

[…] mais de là à mettre une limite fixe de 25 lignes et pénaliser les élèves pour chaque ligne supplémentaires je trouve que c'est de la connerie pure

MeliMelo

Façon de dire, du code de débutant avec une fonction de 25 lignes, j'ai 99.9% de chance de trouver 3 séquences d'instructions qui auraient valu d'avoir une fonction à part entière. En mettant une limite de 25 lignes, tu forces l'étudiant à se bouger le cul pour travailler sa logique de programmation pour respecter le SRP.

Tu veux la mettre où la limite ? à 100 ? C'est trop. à 10 ? OK, c'est probablement pas assez. Il faut faire un choix, et ce type de choix arbitraire est très classique dans les règles qualités qui nous sont demandées de respecter. J'aime bien spécifier en quantité de pages d'écran (une demi, en ce qui me concerne), mais les qualiticiens, qui imposent l'utilisation d'outils bêtes et méchants, veulent de seuils précis pour calibrer leurs outils. Ces écoles, en imposant un seuil à 25, préparent leurs élèves à respecter des seuils. Qu'ils soient intelligents ou pas.

Bon sinon au passage Ricocotam t'es conseils m'ont ete precieux. J'ai donc vire le makeBaby() de chacune des classes filles et je l'ai foutu dans la classe Poisson directement.

Pour ce qui est du probleme de pointeur nul, tu avais egalement vu juste, ca venait bien de ma boucle for que j'ai du coup remplace par une boucle do while et tout marche nikel (enfin j'ai fait 2 - 3 tests et ca a l'air de marcher.

J'ai aussi juste rajoute un petit test pour faire les bebes : le poisson doit etre plus age que 1 ans sinon comme je rajoute les bebes en fin de liste ca veut dire qu'ils peuvent se reproduire le tour meme ou ils ont ete mis au monde et ca me donne a la longue un aquarium avec un population tres inegale.

Hello tout le monde!

Cet après-midi, après plusieurs mois de boulot, j'avais enfin quelques heures devant moi et… Que faire, sinon se prêter à ce petit jeu? Je propose donc une solution (NB: toutes les gestions de string sont faites sans caractère accentué… Habitude oblige), que vous trouverez ici. Alors, comme elle a été codée rapidement il est évident que le style ne sera pas des plus propres. Cependant, pour les autres, j'ai juste deux commentaires par rapport à l'énoncé:

  1. Il est dit que chaque poisson à un genre, mais l'exemple de fichier pour "charger" les poissons donne le format : [nom], [race], [âge]. Il serait judicieux, à mon avis, d'ajouter un champ "[genre]" pour pouvoir préciser le genre du poisson à l'insertion.

  2. Il est peut-être difficile de corriger ceci, mais la balance des espèces n'est pas très bonne : les espèces hermaphrodites carnivores d'opportunité gagnent à quasiment tous les coups!

Voilà pour les commentaires. Pour les hypothèses, je suis parti du principe qu'un poisson "mordu" pouvait quand même manger un autre poisson… Et deux trois autres hypothèses qui, si vous avez le courage d'explorer le code vous les trouverez facilement, m'ont facilité la vie.

Merci pour ce défi, très rafraichissant! Si vous avez des commentaires, lâchez-vous!

+2 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte