2012-06-29 24 views
6

Al observar una excepción en Java en un depurador, a menudo verá que la causa es recurrente en sí misma infinitamente (supongo que es infinita).¿Qué causa la causa recursiva en una excepción?

por ejemplo:

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

¿Por qué es esto?

NB: Esto es cuando se mira el código en un depurador, Eclipse en este caso.

+1

nunca he visto que ... y creo que sin detalles que es difícil decir que – hage

+2

hacer ¿Tienes algún código al que te refieres? Es mucho más claro si tiene código + seguimiento de la pila del error – vandershraaf

+0

más detalles, por favor, tal vez un código? –

Respuesta

15

Mirando el 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; 

así que supongo que lo que está viendo es una excepción que fue creado sin necesidad de utilizar uno de los constructores que tarda una causa.

Usted verá esto en un depurador, pero getCause cuida de no devolver la referencia recursiva:

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

Parece un error que está por ocurrir, si alguna vez inventa el viaje en el tiempo. ¿Qué pasa si una excepción se remonta en el tiempo y se hace pasar? _Dun dun dunnnnn! _ – yshavit

+0

Me parece una pregunta interesante. Frecuentemente veo excepciones lanzadas por bibliotecas subyacentes que se refieren a sí mismas como su causa, creando así un ciclo sin fin. ¿Por qué querría uno hacer esto? –

+2

Este es un ejemplo interesante de cómo las partes ocultas y encapsuladas de una API pueden causar problemas para los desarrolladores (en este caso, alguien intentó empaquetar 2 valores en un campo, tal vez por algunos motivos de rendimiento). A menudo me encuentro expandiendo 'causa'es en IntelliJ y después de diez niveles preguntando WTF ... – csharpfolk

Cuestiones relacionadas