2013-08-07 3 views
0

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.

+1

Je pense que vous avez une parenthèse fermante trop après getTeam(). –

+2

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. –

+1

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? –

Répondre

1

Le problème est votre parenthèse. Essayez

return (map.isWalkable(x,y) && (!map.isOccupied(x,y) || map.getOccupant(x, y).getTeam() == team)); 
+0

Merci de m'avoir signalé cela, j'ai édité la question pour la corriger mais ce n'était pas ce qui causait l'exception. – Setzer22

+0

Une exception NullPointerException ne serait lancée que dans deux cas de ce code: soit 'map' est nul, et l'exception est levée lorsque vous essayez d'exécuter une méthode sur un objet' null', ou le retour de 'map.getOccupant (x , y) 'est nul, et l'exception est levée parce que vous essayez d'appeler' getTeam() 'sur un objet' null'. – Deactivator2

+0

Oui, la question est déjà répondu, mais je ne pouvais pas le marquer comme répondu rapidement que SO ne me laisse pas. Mais merci quand même. EDIT: Eh bien, il semble que non. Quelqu'un a effacé la réponse que j'allais accepter ... – Setzer22

1

Dit simplement, non, l'évaluation paresseuse n'est pas rompue. Votre code est. Soit map est nul, soit map.getOccupant(x,y) renvoie null. Si vous les mettez sur leurs propres lignes et les parcourez avec un débogueur, vous remarquerez que "oh non, j'étais si stupide et je n'ai pas remarqué ça".

Le compilateur, JVM ou quoi que ce soit d'autre n'a rien à voir avec cela.

Questions connexes