Java数学-测试NaN

6
我希望有一种项目范围内的快速失败机制(可能是一个RuntimeException),用于任何导致NaN赋值的代码。
在我的项目中,NaN从不是有效值。
我意识到我可以添加断言(使用isNaN)或其他测试,但我想知道是否有更优雅的方法。

你实际上打算做什么? - helpermethod
2
我想做的是在不在代码中到处散布isNaN测试的情况下,精确地知道复杂数值计算出了什么问题。在许多其他环境中,我可以使用IEEE 754陷阱,但是在JVM上却不能这样做。 - Jouni K. Seppänen
5个回答

4
不会 - 因为NaN是一个有效的值,使用它不会引发任何异常。如果没有任何普遍的监控机制可用,您将必须在可能被分配或从方法返回的点显式地进行测试。

4

是的,您可以使用AspectJ(面向切面编程)在将值设置为NaN时抛出错误。

基本上,您想拦截每次设置值,并执行其他功能。

我们在代码库中做过类似的事情...但我不能在这方面给您太多帮助。


2

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


2
从技术上讲,通过对相关代码进行仪表化,自动注入assertif测试来创建一个代理是可能的。这将涉及一些字节码检查和转换(例如使用ASM)。在我看来,这需要非常特殊的情况才能成立。你必须小心,不要对任何依赖于内部处理NaN的类进行操作。
据我所知,没有人编写过这样的代理。如果你正在寻找灵丹妙药,我认为并没有这样的东西。

2

另一种方法是将代码检查器(例如PMD)集成到构建过程中,并创建一个规则,报告每个Double.NaN的赋值。

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接