2016-02-05 53 views
3

在使用eclipse IDE調試HttpClientErrorException時,我注意到屬性「cause」包含對錯誤本身的引用,所以我經過並在那裏得到了屬性「cause」又一次,又一次......直到永遠。爲什麼屬性異常的原因是重複的

爲什麼這個屬性包含對自身的引用?

cause

回答

6

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更改。

+0

謝謝。我在doc中發現的內容:「如果這個字段等於這個可拋出的本身,那麼表明這個可拋出的元素的原因尚未初始化。」 –

+0

@mrMonoProgrammer yes。您可以通過在構造函數中傳遞Throwable或通過調用'initCause'來初始化它。如果沒有這樣做,它會指向這一點。 'Throwable.getCause()'也注意到了這個事實。 – wero

0

你有權訪問的源,其中該Exception創建?

大號ooks like HttpClientErrorException object was created and then cause field was modified to be the same object,may use initCause

相關問題