Java数学 - 测试NaN

时间:2010-01-26 15:52:15

标签: java math nan

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

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

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

5 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:4)

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

基本上,您希望在设置值时拦截,并执行其他一些功能。

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

答案 2 :(得分:2)

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

答案 3 :(得分:2)

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

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

答案 4 :(得分:2)

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

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

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