什么导致异常中的递归原因?

11
在Java调试器中查看异常时,通常会看到异常的原因是无限递归到自身(我假设这是无限的)。
例如:
Exception1, 
  Caused by -> Exception2 
     Caused by -> Exception2
        Caused by -> Exception2 

为什么会这样呢?

NB:这是在调试器中查看代码时出现的情况,例如在Eclipse中。


1
我从未见过那个... 我认为没有细节很难说清楚。 - hage
2
你有参考的代码吗?如果你有代码和错误的堆栈跟踪,会更清晰明了。 - vandershraaf
更多细节请,也许需要一些代码? - Francisco Spaeth
我想知道这是否会导致人们要求代码。我会为你获取一些。我在代码的各个地方都看到过这种情况。不过会提供更多详细信息... - BanksySan
1个回答

20

查看Throwable的源代码

  187       /**
  188        * The throwable that caused this throwable to get thrown, or null if this
  189        * throwable was not caused by another throwable, or if the causative
  190        * throwable is unknown.  If this field is equal to this throwable itself,
  191        * it indicates that the cause of this throwable has not yet been
  192        * initialized.
  193        *
  194        * @serial
  195        * @since 1.4
  196        */
  197       private Throwable cause = this;

我猜你看到的是一个异常,它是在没有使用带有原因参数的构造函数创建的。
你可以在调试器中看到这个异常,但getCause会处理不返回递归引用的情况。
  414       public synchronized Throwable getCause() {
  415           return (cause==this ? null : cause);
  416       }

6
如果有人发明了时间旅行,这似乎是一个等待发生错误的漏洞。如果一个例外情况回到过去并导致自己发生会怎样?咚咚咚! - yshavit
我认为这是一个有趣的问题。我经常看到底层库抛出异常,将自己作为原因引用,从而创建一个无限循环。为什么会有人想要这样做呢? - Pierre Henry
5
这是一个有趣的例子,展示了API中隐藏和封装的部分可能会给开发人员带来问题(这里有人试图将2个值打包到一个字段中,可能出于一些性能原因)。我经常在 IntelliJ 中展开“cause”并经过十层后想知道到底是怎么回事... - csharpfolk
我非常确信IDE的开发团队已经意识到了这个问题,他们很可能会尝试向IDE的调试器中添加一些代码来掩盖它,但他们可能会决定:“这不是我们的错 - 构建Java的人不应该用这种愚蠢的方式做事”。 - Mike Nakis

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