Java Mathematik - Prüfung für NaN
Frage
Ich möchte eine Art haben projektweiten scheitern schnell Mechanismus (vielleicht ein RuntimeException
) für jeden Code, der Zuordnung von NaN
verursacht.
In meinem Projekt NaN
ist nie ein gültiger Wert.
Ich weiß, ich könnte hinzufügen, behauptet (mit
Lösung Ja, können Sie AspectJ (aspektorientierte Programmierung) verwenden, um einen Fehler zu werfen, wenn ein Wert auf NaN gesetzt. Im Wesentlichen mögen Sie abfangen, wenn ein Wert festgelegt ist, und eine andere Funktion erfüllen. Wir haben in unserer Code-Basis ähnliche Dinge getan ... aber ich kann Ihnen nicht viel helfen außerhalb davon geben.
Andere Tipps
Nein - weil NaN
ein gültiger Wert ist, verwenden es wird nicht dazu führen Ausnahmen geworfen werden. Ohne allgegenwärtige Überwachungsmechanismen zu nutzen, würden Sie explizit an den Punkten testen müssen, wo es könnte von einem Verfahren zugewiesen oder zurückgeschickt werden.
Wenn Sie die Leistung der Anwendung Opfer bereit, können Sie einen Wrapper für Doppel erstellen (oder ein anderes numerisches Objekt Sie verwenden möchten) und werfen Ausnahme, wenn NaN
Satz ist.
Technisch wäre es möglich, ein Mittel zu schaffen, dies zu tun, indem Sie den Code in Frage einzuspritzen instrumentiert Assertion oder , wenn Tests automatisch. Dies würde ein wenig Bytecode Inspektion beinhaltet und Transformation (zum Beispiel unter Verwendung von ASM ). Meiner Meinung nach wäre es außergewöhnliche Umstände nehmen, dies zu rechtfertigen. Sie müßten vorsichtig sein, nicht zu Instrumente aller Klassen, die Verfahren darauf setzen, NaN intern.
Ich bin mir nicht bewusst, dass jemand ein solches Mittel geschrieben hat. Wenn Sie sich für einen Königsweg suchen, glaube ich nicht, es ist.
Ein weiterer Ansatz - könnten Sie Code Kontrolleure wie PMD in Ihren Build-Prozess integrieren und eine Regel erstellen, berichtet jeden Auftrag von Double.NaN
.
Es wird nicht perfekt sein, weil es nicht fangen kann NaN ist man von außen bekommen (Datenbank, Verbindungen), oder dass jemand schafft durch Manipulation wenig, aber zumindest kann man das Double.NaN
versichern kann, nicht zu einer Variablen zugewiesen werden oder als Methodenparameter oder innerhalb einer Auswertung verwendet werden.
definiert die Regeln könnten eine Herausforderung sein - aber zumindest - es ist ein anderer Ansatz. Die einfachste Regel könnte sein Double.NaN
überhaupt zu verbieten.