Edd*_*ada 5 java spring exception-handling exception
在使用eclipse IDE调试HttpClientErrorException时,我注意到属性"cause"包含对错误本身的引用,所以我经历了那里,它再次成为属性"cause",并且再次......永远.
为什么这个属性包含对自身的引用?
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更改.
| 归档时间: |
|
| 查看次数: |
130 次 |
| 最近记录: |