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
。