O que poderia causar java.lang.reflect.InvocationTargetException?

Bem, I'tentei entender e ler o que poderia causar isso, mas simplesmente não consigo'não consigo entender:

Eu tenho isto algures no meu código:

 try{
 ..
 m.invoke(testObject);
 ..
 } catch(AssertionError e){
 ...
 } catch(Exception e){
 ..
 }

O problema é que, quando tenta invocar algum método, atira InvocationTargetException' ao invés de alguma outra exceção esperada (especificamente 'ArrayIndexOutOfBoundsException'). Como eu realmente sei qual método é invocado, fui direto para este código de método e adicionei um bloco de tentativa de captura para a linha que supõe lançar ArrayIndexexOutOfBoundsException' e realmente jogouArrayIndexOutOfBoundsException' como esperado. No entanto, ao subir a linha de alguma forma muda para InvocationTargetException' e no código acimacatch(Exception e)` e é "InvocationTargetException" e não "ArrayIndexOutOfBoundsException". como esperado.

O que poderia causar tal comportamento ou como posso verificar tal coisa?

Solução

Você'adicionou um nível extra de abstração chamando o método com reflexão. A camada de reflexão envolve qualquer exceção em uma `InvocationTargetException', o que lhe permite dizer a diferença entre uma exceção atualmente causada por uma falha na chamada de reflexão (talvez sua lista de argumentos fosse't válida, por exemplo) e uma falha dentro do método chamado.

Basta desembrulhar a causa dentro da "InvocationTargetException" e você'vai chegar ao original.

Comentários (14)

A exceção é lançada se

InvocationTargetException - se o método subjacente lançar uma exceção.

Então, se o método, que foi invocado com a API de reflexão, lança uma exceção (exceção em tempo de execução, por exemplo), a API de reflexão irá envolver a exceção em uma `InvocationTargetException'.

Comentários (1)

Do Javadoc do método.invoke()

Gargantas: InvocationTargetException - se o método subjacente lançar uma excepção.

Esta excepção é lançada se o método chamado de excepção.

Comentários (2)