【问题标题】:Eclipse: Stop on NotANumberEclipse:在 NotANumber 上停止
【发布时间】:2011-07-07 03:13:37
【问题描述】:

我在这里有一个相当复杂的项目,涉及大量计算。现在我有一个结果是NaN 的情况。由于计算涉及到很多类(并且 NaN 往往像僵尸一样传播),因此很难确定其来源。

现在我想知道,有没有人知道让 eclipse 调试器停止执行的方法是NaN?由于 Java 不支持在 NaN 上自动引发异常,这会很困难,但也许它已经完成了,我错过了?

谢谢, 阿克塞尔

PS:我知道我可以在Double.isNaN(value) 上添加条件断点(或 if 语句),但我不得不在很多地方这样做。 (事实上​​,这就是我现在要做的。)只是想知道是否有更好的选择。

【问题讨论】:

    标签: java eclipse debugging nan


    【解决方案1】:

    我认为没有更简单的方法。

    顺便说一句,完整的 IEEE-754 (2008) 标准具有“异常处理”机制(与 Java/C#/等异常无关)。有 5 个例外:

    1. 无效操作
    2. 除以零
    3. 溢出
    4. 下溢
    5. 结果不准确

    该规范还为这些异常中的每一个提供了默认的异常处理策略,它们是:

    1. 替换为 NaN
    2. 替换一个(适当签名的)无穷大
    3. 替换一个(适当签名的)无穷大
    4. 忽略
    5. 忽略

    该标准还建议用户能够覆盖这些默认值,使用另一种异常处理策略(提供了几种),或使用自定义语言特定策略(例如在 Java 中抛出异常)。

    不幸的是,几乎所有现代语言都完全忽略了规范的这一部分,并假设默认的异常处理策略“足够好”。

    【讨论】:

      【解决方案2】:

      现在我想知道,有没有人知道让 eclipse 调试器停止执行命中 NaN 的方法?

      我怀疑。

      由于正常的 Java 行为是在出现 NaN 时不引发异常,因此调试器需要在每个可能生成条件断点的语句处插入条件断点。这将在运行时实现起来很复杂并且成本很高。而且您的用例非常不寻常。

      我认为更好的方法可能是将 Java 断言添加到您的代码中的几个精心选择的位置。

      【讨论】:

      • 迄今为止最好的解决方案:在不同的地方添加 assert !Double.isNaN(value) 并在 java.lang.AssertionError 上添加异常断点非常接近我想要的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-01-20
      • 2010-10-27
      • 1970-01-01
      • 2014-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多