为什么异常的财产"原因"会永远重复?

Edd*_*ada 5 java spring exception-handling exception

在使用eclipse IDE调试HttpClientErrorException时,我注意到属性"cause"包含对错误本身的引用,所以我经历了那里,它再次成为属性"cause",并且再次......永远.

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

原因

wer*_*ero 8

Throwable 声明

private Throwable cause = this;
Run Code Online (Sandbox Code Playgroud)

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

public synchronized Throwable getCause() {
    return (cause==this ? null : cause);
}
Run Code Online (Sandbox Code Playgroud)

更新:

这种设计的原因也解释Throwable如下:

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

1)字段被初始化为非空的标记值,该值表示逻辑上未设置该值.

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

3)sentinel值可以用另一个非null值替换.

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