在使用eclipse IDE調試HttpClientErrorException時,我注意到屬性「cause」包含對錯誤本身的引用,所以我經過並在那裏得到了屬性「cause」又一次,又一次......直到永遠。爲什麼屬性異常的原因是重複的
爲什麼這個屬性包含對自身的引用?
在使用eclipse IDE調試HttpClientErrorException時,我注意到屬性「cause」包含對錯誤本身的引用,所以我經過並在那裏得到了屬性「cause」又一次,又一次......直到永遠。爲什麼屬性異常的原因是重複的
爲什麼這個屬性包含對自身的引用?
Throwable
傳遞一個原因在構造函數或致電initCause
聲明
private Throwable cause = this;
如果原因尚未被初始化,或者說,它會繼續指向this
。請注意,因此getCause
被實現爲:
public synchronized Throwable getCause() {
return (cause==this ? null : cause);
}
更新:
的原因這樣的設計也是在Throwable
解釋說:
要允許進行的Throwable對象不可改變和安全被 重複使用,例如OutOfMemoryErrors,Throwable的 字段,可響應用戶操作,cause,stackTrace和 suppressedExceptions服從以下協議:
1)這些字段被初始化爲非空標記值,其中 表示該值邏輯上未設置。
2)寫入一個空的字段指示進一步的寫入是被禁止的
3)標記值可以與另一個非空值代替。
例如,HotSpot JVM的實現已預分配了 OutOfMemoryError對象,以提供對該 情況更好的可診斷性。創建這些對象時,不需要爲該類調用構造函數 ,並且有問題的字段被初始化爲null。若要支持此功能,則任何添加到Throwable的新字段 需要初始化爲非空值,這需要協調一致的 JVM更改。
你有權訪問的源,其中該Exception
創建?
大號ooks like HttpClientErrorException
object was created and then cause
field was modified to be the same object,may use initCause
。
謝謝。我在doc中發現的內容:「如果這個字段等於這個可拋出的本身,那麼表明這個可拋出的元素的原因尚未初始化。」 –
@mrMonoProgrammer yes。您可以通過在構造函數中傳遞Throwable或通過調用'initCause'來初始化它。如果沒有這樣做,它會指向這一點。 'Throwable.getCause()'也注意到了這個事實。 – wero