2011-06-30 26 views
9

tengo un método que a veces se produce una excepción:¿Por qué ocasionalmente Throwable.getMessage() devuelve null?

this.items[index] = element; 

Y tengo una prueba de unidad que afirma que la excepción que debe ser arrojado en realidad es lanzada:

try 
{ 
    doSomethingWithIndex(-1); 
    Assert.fail("should cause exception"); 
} 
catch (IndexOutOfBoundsException expected) 
{ 
    Assert.assertNotNull(expected.getMessage()); 
} 

Esta prueba se ejecuta como parte de la construcción continua y, a veces, ocasionalmente falla porque getMessage() de hecho devuelve nulo. ¿Por qué sucedería esto? Mi código nunca puede lanzar una excepción con un mensaje nulo.

EDITAR

Mi ejemplo código original era engañosa, la excepción lanzada en realidad proviene de la indexación directamente una matriz. Sin embargo, puedo reproducir el mismo comportamiento con una excepción arrojada personalizada.

he añadido el código sugerido:

salida
catch (IndexOutOfBoundsException expected) 
{ 
    if (expected.getMessage() == null) 
    { 
     expected.printStackTrace(); 
    } 
    Assert.assertNotNull(expected.getMessage()); 
} 

La consola no se encuentra el seguimiento de la pila, además de la causa. Aquí está la salida completa:

java.lang.ArrayIndexOutOfBoundsException 
+3

¿Estás seguro de que no es una excepción IndexOutOfBoundsException lanzada por otra cosa? Te sugiero que vuelques el rastro de la pila de '' esperado '' cuando te encuentres con esto. –

+0

En segundo lugar la sugerencia de Jon. No olvide que probablemente esté atrapando una ArrayIndexOutOfBoundsException o una StringIndexOutOfBoundsException. –

+0

@ Ted, @ Jon: ¿no son las predeterminadas StringIndexOutOfBoundException y ArrayIndexOutOfBoundException las que generan un mensaje cuando se lanzan? (el elemento al que intentabas acceder)? – amit

Respuesta

1

Trate de imprimir la pila de la excepción cuando tiene un mensaje nulo. Es posible que otro código lo arroje. Como si realmente accedieras a la longitud de la matriz pasada.

0

Usted escribió que: "Mi código no puede lanzar una excepción con un mensaje nulo"

¿Está yousing cualquier biblioteca tercera parte? Supongo que los códigos java estándar nunca arrojan excepciones como esta arriba, pero algunos jar con código vertido ... :)

+0

No hay bibliotecas de terceros. Veo este comportamiento "parpadeante" tanto para mis propias excepciones lanzadas como para hacer referencia a una matriz directamente con un índice -1. –

Cuestiones relacionadas