2012-06-29 12 views
6

Patrząc na wyjątek w Javie w debugerze, często widzi się, że przyczyna jest nieskończenie rekursywna (zakładam, że jest nieskończona).Co powoduje przyczynę rekurencyjną w wyjątku?

np:

Exception1, 
    Caused by -> Exception2 
    Caused by -> Exception2 
     Caused by -> Exception2 

Dlaczego tak jest?

NB: To jest kiedy patrząc na kod w debugerze, Eclipse w tym przypadku.

+1

Nigdy nie widziałem, że ... i myślę, że bez szczegółów trudno powiedzieć – hage

+2

Czy masz jakiś kod, do którego się odnosisz? To jest o wiele jaśniejsze, jeśli masz kod + ślad stosu błędu – vandershraaf

+0

więcej szczegółów, może kod? –

Odpowiedz

15

Patrząc na source code of Throwable:

187  /** 
    188  * The throwable that caused this throwable to get thrown, or null if this 
    189  * throwable was not caused by another throwable, or if the causative 
    190  * throwable is unknown. If this field is equal to this throwable itself, 
    191  * it indicates that the cause of this throwable has not yet been 
    192  * initialized. 
    193  * 
    194  * @serial 
    195  * @since 1.4 
    196  */ 
    197  private Throwable cause = this; 

Więc myślę, że to, co widzisz jest wyjątek, który został stworzony bez użycia jednego z konstruktorów, która zajmuje przyczyny.

Zobaczysz to w debugger, ale getCause dba o nie zwracając rekurencyjną odniesienie:

414  public synchronized Throwable getCause() { 
    415   return (cause==this ? null : cause); 
    416  } 
+4

Wygląda na to, że czeka go jakiś błąd, jeśli w ogóle wymyśli podróż w czasie. Co się stanie, jeśli wyjątek cofnie się w czasie i stanie się przyczyną? _Dun dun dunnnnn! – yshavit

+0

Uważam to za interesujące pytanie. Często widzę wyjątki wyrzucane przez leżące u ich podstaw biblioteki, które same się odradzają jako przyczynę, tworząc niekończący się cykl. Dlaczego ktoś chciałby to zrobić? –

+2

To jest interesujący przykład tego, jak ukryte i zamknięte części API mogą powodować problemy dla programistów (tutaj ktoś próbował spakować 2 wartości do jednego pola, może z pewnych powodów wydajności). Często odkrywam, że rozszerzam 'cause'es w IntelliJ i po dziesięciu poziomach zastanawiam się WTF ... – csharpfolk

Powiązane problemy