6

对于RuntimeException导致分配NaN.

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

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

4

5 回答 5

4

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

于 2010-01-26T15:56:56.997 回答
4

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

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

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

于 2010-01-26T16:15:28.590 回答
2

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

于 2010-01-26T16:00:16.957 回答
2

只是另一种方法 - 您可以将PMD之类的代码检查器集成到您的构建过程中,并创建一个规则来报告Double.NaN.

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

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

于 2010-01-26T16:46:42.140 回答
2

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

我不知道有人写过这样的代理。如果您正在寻找灵丹妙药,我认为没有。

于 2010-01-26T16:17:22.673 回答