Java数学 – 测试NaN

我希望为任何导致NaN分配的代码都有某种项目范围的失败快速机制(可能是RuntimeException )。

在我的项目中, NaN永远不是有效值。

我意识到我可以添加断言(使用isNaN )或其他测试,但我想知道是否有更优雅的方式。

是的,只要将值设置为NaN,就可以使用AspectJ(面向方面​​编程)抛出错误。

实质上,您希望在设置值时拦截,并执行其他一些function。

我们在代码库中做了类似的事情……但除此之外我无法给你太多帮助。

否 – 因为NaN是一个有效值,使用它不会导致抛出任何exception。 如果没有任何普遍使用的监视机制,则必须在可能从方法分配或返回的位置进行显式测试。

如果您准备牺牲应用程序的性能,可以为Double(或您想要使用的其他数字对象)创建一个包装器,并在设置NaN时抛出exception。

从技术上讲,可以创建一个代理来执行此操作,方法是检测有问题的代码以自动注入断言或测试。 这将涉及一些字节码检查和转换(例如使用ASM )。 在我看来,需要特殊情况才能保证这一点。 您必须小心不要检测任何依赖于能够在内部处理NaN的类

我不知道有人写过这样的经纪人。 如果你正在寻找一颗银弹,我认为没有。

另一种方法 – 您可以将PMD等代码检查器集成到构建过程中,并创建一个报告Double.NaN每个分配的Double.NaN

它不会是完美的,因为它无法捕获你从外部获得的NaN(数据库,连接)或者某人通过位操作创建但至少可以确保Double.NaN不能分配给变量或者是用作方法参数或在评估中使用。

定义规则可能具有挑战性 – 但至少 – 这是另一种方法。 最简单的规则可能是禁止Double.NaN