我希望为导致RuntimeException
分配的任何代码提供某种项目范围的失败快速机制(可能是NaN
)。
在我的项目NaN
中永远不是有效值。
我意识到我可以添加断言(使用isNaN)或其他测试,但我想知道是否有更优雅的方式。
答案 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
。