2016-02-05 87 views
3

在使用eclipse IDE调试HttpClientErrorException时,我注意到属性“cause”包含对错误本身的引用,所以我经过并在那里得到了属性“cause”又一次,又一次......直到永远。为什么属性异常的原因是重复的

为什么这个属性包含对自身的引用?

cause

回答

6

Throwable传递一个原因在构造函数或致电initCause声明

private Throwable cause = this; 

如果原因尚未被初始化,或者说,它会继续指向this。请注意,因此getCause被实现为:

public synchronized Throwable getCause() { 
    return (cause==this ? null : cause); 
} 

更新:

的原因这样的设计也是在Throwable解释说:

要允许进行的Throwable对象不可改变和安全被 重复使用,例如OutOfMemoryErrors,Throwable的 字段,可响应用户操作,cause,stackTrace和 suppressedExceptions服从以下协议:

1)这些字段被初始化为非空标记值,其中 表示该值逻辑上未设置。

2)写入一个空的字段指示进一步的写入是被禁止的

3)标记值可以与另一个非空值代替。

例如,HotSpot JVM的实现已预分配了 OutOfMemoryError对象,以提供对该 情况更好的可诊断性。创建这些对象时,不需要为该类调用构造函数 ,并且有问题的字段被初始化为null。若要支持此功能,则任何添加到Throwable的新字段 需要初始化为非空值,这需要协调一致的 JVM更改。

+0

谢谢。我在doc中发现的内容:“如果这个字段等于这个可抛出的本身,那么表明这个可抛出的元素的原因尚未初始化。” –

+0

@mrMonoProgrammer yes。您可以通过在构造函数中传递Throwable或通过调用'initCause'来初始化它。如果没有这样做,它会指向这一点。 'Throwable.getCause()'也注意到了这个事实。 – wero

0

你有权访问的源,其中该Exception创建?

大号ooks like HttpClientErrorException object was created and then cause field was modified to be the same object,may use initCause

相关问题