在使用eclipse IDE调试HttpClientErrorException时,我注意到了属性"导致"包含对错误本身的引用,所以我经历了那里的财产"原因"又一次......永远。
为什么此属性包含对自身的引用?
答案 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
。