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:
salidacatch (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
¿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. –
En segundo lugar la sugerencia de Jon. No olvide que probablemente esté atrapando una ArrayIndexOutOfBoundsException o una StringIndexOutOfBoundsException. –
@ Ted, @ Jon: ¿no son las predeterminadas StringIndexOutOfBoundException y ArrayIndexOutOfBoundException las que generan un mensaje cuando se lanzan? (el elemento al que intentabas acceder)? – amit