对于RuntimeException
导致分配NaN
.
在我的项目NaN
中永远不是有效值。
我意识到我可以在整个过程中添加断言(使用isNaN)或其他测试,但我想知道是否有更优雅的方式。
否 - 因为NaN
IS 是一个有效值,使用它不会引发任何异常。如果没有使用任何普遍存在的监控机制,您将不得不在可能被分配或从方法返回的点上进行显式测试。
是的,只要将值设置为 NaN,您就可以使用 AspectJ(面向方面的编程)引发错误。
本质上,您希望在设置值时进行拦截,并执行其他一些功能。
我们在我们的代码库中做了类似的事情......但除此之外我不能给你太多帮助。
如果您准备牺牲应用程序的性能,您可以为 Double(或您要使用的其他数字对象)创建一个包装器,并在NaN
设置时抛出异常。
只是另一种方法 - 您可以将PMD之类的代码检查器集成到您的构建过程中,并创建一个规则来报告Double.NaN
.
它不会是完美的,因为它无法捕获您从外部(数据库、连接)或某人通过位操作创建的 NaN,但至少您可以确保Double.NaN
不能将其分配给变量或用作方法参数或评估内部。
定义规则可能具有挑战性——但至少——这是另一种方法。最简单的规则可能是完全禁止Double.NaN
。
从技术上讲,可以通过检测相关代码以自动注入断言或if测试来创建代理来执行此操作。这将涉及一些字节码检查和转换(例如使用ASM)。在我看来,需要特殊情况才能保证这一点。您必须小心不要检测任何依赖于能够在内部处理NaN的类。
我不知道有人写过这样的代理。如果您正在寻找灵丹妙药,我认为没有。