为什么财产导致"异常永远重复?

时间:2016-02-05 18:06:31

标签: java spring exception exception-handling

在使用eclipse IDE调试HttpClientErrorException时,我注意到了属性"导致"包含对错误本身的引用,所以我经历了那里的财产"原因"又一次......永远。

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

cause

2 个答案:

答案 0 :(得分:6)

Throwable声明

private Throwable cause = this;

如果未初始化原因,无论是通过在构造函数中传递原因还是通过调用initCause,都会继续指向this。请注意,因此getCause实现为:

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

更新:

此设计的原因也在Throwable

中进行了解释
  

允许Throwable对象不可变并安全地重用   JVM,例如OutOfMemoryErrors,Throwable的字段   可写,以响应用户操作,原因,stackTrace和   suppressExceptions遵循以下协议:

     

1)字段初始化为非null的sentinel值   表示逻辑上未设置该值。

     

2)向字段写入空值表示禁止进一步写入

     

3)sentinel值可以替换为另一个非null值。

     

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

答案 1 :(得分:0)

您是否可以访问创建此Exception的来源?

看起来HttpClientErrorException对象已创建,然后其cause字段被修改为同一对象,可能使用initCause