Java 为什么是房地产'';原因“;例外是永远重复吗?
在使用eclipse IDE调试HttpClientErrorException时,我注意到属性“cause”包含对错误本身的引用,所以我仔细检查了一遍,发现属性“cause”一次又一次地出现了。。。永远 为什么此属性包含对自身的引用Java 为什么是房地产'';原因“;例外是永远重复吗?,java,spring,exception,exception-handling,Java,Spring,Exception,Exception Handling,在使用eclipse IDE调试HttpClientErrorException时,我注意到属性“cause”包含对错误本身的引用,所以我仔细检查了一遍,发现属性“cause”一次又一次地出现了。。。永远 为什么此属性包含对自身的引用 您有权访问创建此异常的源代码吗 看起来好像创建了HttpClientErrorException对象,然后其cause字段被修改为同一个对象,可能是使用了initCause Throwable声明 private Throwable cause = this;
您有权访问创建此
异常的源代码吗
看起来好像创建了HttpClientErrorException
对象,然后其cause
字段被修改为同一个对象,可能是使用了initCause
Throwable
声明
private Throwable cause = this;
如果原因未初始化,通过在构造函数中传递原因或调用initCause
,它将继续指向此
。请注意,因此,getCause
实现为:
public synchronized Throwable getCause() {
return (cause==this ? null : cause);
}
更新:
此设计的原因也在可丢弃的中解释:
允许可丢弃的对象不可变,并由
JVM,例如OutOfMemoryErrors,可丢弃的字段
可写以响应用户操作、原因、堆栈跟踪和
抑制异常遵守以下协议:
1) 字段初始化为非空的sentinel值,该值
表示逻辑上未设置该值
2) 向字段写入null表示禁止进一步写入
3) sentinel值可以替换为另一个非空值
例如,热点JVM的实现已经预先分配了
OutOfMemoryError对象以提供更好的可诊断性
情况。这些对象是在不调用构造函数的情况下创建的
对于该类,相关字段初始化为null。到
支持此功能,任何添加到Throwable的新字段
需要初始化为非空值需要协调
JVM改变
谢谢我在文档中发现:“如果此字段等于此可丢弃项本身,则表明此可丢弃项的原因尚未初始化。”@mrMonoProgrammer yes。您可以通过在构造函数中传递Throwable或调用initCause
来初始化它。如果不这样做,它将指向这一点。另外,Throwable.getCause()
也观察到了这一事实。