J'ai dû évaluer une expression booléenne fréquemment, donc je l'ai convertie dans une méthode privée dans sa classe. Voici le code il me causer des ennuis:L'évaluation paresseuse ne fonctionnait pas comme il se doit
//"x", "y" and "team" are already defined
return (map.isWalkable(x,y) &&
(!map.isOccupied(x,y) || map.getOccupant(x, y).getTeam() == team));
Les méthodes doivent être preety beaucoup plus explicite que dans le but de cette question. Maintenant, isWalkable et isOccupied renvoient tous les deux un booléen, et getOccupant est la seule méthode renvoyant une référence d'objet. Le problème est que je reçois une exception NullPointerException lors de l'exécution de ce morceau de code, et cela ne devrait pas se produire car isOccupied renvoie true si et seulement si map.getOccupant! = Null (c'est en fait ce que renvoie cette méthode). Donc, avec un langage supportant l'évaluation booléenne paresseuse de gauche à droite (comme je suppose que java est, ou du moins c'est ce que j'ai pu lire), la méthode getOccupant ne devrait jamais être exécutée à chaque fois qu'elle retournerait null?
Est-ce plus dépendant du compilateur que je ne le pensais? Est-ce que je devrais être plus en sécurité si j'ai utilisé des déclarations ou s'il y a simplement quelque chose d'évident qui me manque ici, peut-être que les opérations seront résolues dans l'autre sens.
Je pense que vous avez une parenthèse fermante trop après getTeam(). –
Ceci est si facile à déboguer, pourquoi demander ici? Affectez chaque sous-résultat à sa propre variable et imprimez-les/testez-les pour 'null'. C'est un travail de 3 minutes, si vous êtes lent. –
Je suis tout à fait sûr que ce n'est pas le code original (puisqu'il a un problème d'analyse avec vos parenthèses de fermeture), alors comment savons-nous que vous n'avez pas fait une autre erreur en effet? –