mathématiques Java - test pour NaN
Question
Je voudrais avoir une sorte de projet à l'échelle échec mécanisme rapide (peut-être un RuntimeException
) pour tout code qui provoque l'affectation de NaN
.
Dans mon NaN
projet est jamais une valeur valide.
Je me rends compte que je pourrais ajouter affirme (en utilisant
La solution Oui, vous pouvez utiliser AspectJ (aspect de la programmation orientée) pour lancer une erreur chaque fois qu'une valeur est définie sur NaN. Essentiellement, vous voulez intercepter chaque fois qu'une valeur est définie et effectuer une autre fonction. Nous avons fait des choses similaires dans notre base de code ... mais je ne peux pas vous donner beaucoup d'aide en dehors de cela.
Autres conseils
Non - parce que NaN
est une valeur valide, en l'utilisant ne causera aucune exception à jeter. Sans aucun mécanisme de surveillance omniprésentes à utiliser, vous devez tester explicitement aux points où il pourrait être affecté ou retour d'une méthode.
Si vous prêt à sacrifier la performance de l'application, vous pouvez créer une enveloppe pour double (ou un autre objet numérique que vous voulez utiliser) et jeter exception lorsque NaN
est réglé.
Techniquement, il serait possible de créer un agent pour le faire par instrumentant le code en question pour injecter assert ou si teste automatiquement. Cela impliquerait un peu d'inspection de bytecode et de transformation (par exemple en utilisant ASM ). À mon avis, il faudrait des circonstances exceptionnelles pour justifier cela. Il faudrait veiller à ne pas instrument toutes les classes qui comptent sur la possibilité de traiter NaN en interne.
Je ne suis pas au courant que quelqu'un a écrit un tel agent. Si vous êtes à la recherche d'une balle d'argent, je ne pense pas qu'il y ait un.
Juste une autre approche - vous pouvez intégrer les dames de code comme PMD dans votre processus de construction et de créer une règle rapports chaque mission de Double.NaN
.
Il ne sera pas parfait, car il ne peut pas attraper NaN de vous obtenez de l'extérieur (base de données, connexions) ou que quelqu'un crée par la manipulation de bits, mais au moins vous pouvez assurer que Double.NaN
ne peut être affecté à une variable ou être utilisé comme un paramètre de procédé ou à l'intérieur d'une évaluation.
La définition des règles peut être difficile - mais au moins - il est une autre approche. La règle la plus simple pourrait être d'interdire Double.NaN
du tout.